分为最好和最坏两种情况,分别讨论
设原先有n个元素
最好情况
在最好情况下,即排序之前的序列本身就是有序的,那么每两个元素仅需对比一次,那么总共对比n-1次,时间复杂度为
O(n)
最坏情况
在最坏情况下,即原本为逆序
下面通过一个例子来说明
这里需要用到代码进行参考,更加直观
//直接插入排序(带哨兵)
void InsertSort(int A[],int n){
int i,j;
for(i=2;i<=n;i++) //依次将A[2]~A[n]插入到前面已排序序列
if(A[i]<A[i-1]){ //若A[i]关键码小于其前驱,将A[i]插入有序表
A[0]=A[i]; //复制为哨兵,A[0]不存放元素
for(j=i-1;A[0]<A[j];--j) //从后往前查找待插入位置
A[j+1]=A[j]; //向后挪位
A[j+1]=A[0]; //复制到插入位置
}
}
我们来通过数学归纳法列一下
第一趟:
70与80比较 比较1次
进入if
将70放在0号位(即哨兵位) 移动1次
将哨兵与80进行比较 比较1次
进入for
将80右移一位 移动1次
此时由于j指向了哨兵,不满足A[0]<A[j],退出for循环
将A[0]的70移到A[j+1] 移动1次
总共:
第1趟 移动3次 比较2次
第2趟 移动4次 比较3次
第3趟 移动5次 比较4次
......
而一共有n个元素,总共有n-1趟
第n-1趟须移动i+2次,比较i+1次
故总的移动次数为
总的比较次数为
注:此处考虑与哨兵的比较,若不考虑与哨兵的比较则在此基础上再减去(n-1)