最优复杂度:当输入数组就是排好序的时候,复杂度为O(n),而快速排序在这种情况下会产生O(n^2)的复杂度。
最差复杂度:当输入数组为倒序时,复杂度为O(n^2) 其实插入排序的复杂度和逆序对的个数一样,当数组倒序时,逆序对的个数为n(n-1)/2,因此插入排序复杂度为O(n^2)。
插入排序比较适合用于“少量元素的数组”。
如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
代码实现如下:
插入排序的改进:二分插入排序
对于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目,我们称为二分插入排序,代码如下:
void InsertSort_Binary(RecType R[],int n) { int i,j,left,right,mid; RecType temp; for(i=1;i<n;i++) { temp=R[i]; left=0; right=i-1; //初始化左右边界 while(left<=right) //采用二分法查找新元素插入的位置 { mid=(left+right)/2; if(R[mid].key>temp.key) right= mid-1; else left = mid+1; } for(j=i-1;j>0;j--) R[j]=R[j+1]; //将新元素插入位置后面的元素像后移动一位 R[left]=temp; //插入新元素 } }
当n较大时,二分插入排序的比较次数比直接插入排序的最差情况好得多,但比直接插入排序的最好情况要差,所当以元素初始序列已经接近升序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素初始序列。