插入排序(Insertion Sorting)就是每次都将一个无序的待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
比较顺序是有序部分的从右到左(从大到小)和有序部分比较,
算法描述:
将待排数组L[0..n-1](共n个数)分为两部分,L[0..i]为有序部分,L[i+1..n-1]为未排序部分。
1.i=0.
2.把L[i+1]插入到L[0..i]中的正确位置,i++.
3.if(i<n-1)
goto 2.
4.停止
具体算法如下:
template<class Key>
void InsertSort(Key L[], int n){
int i,j;
Key temp;
for(i=1; i<n; i++){
for(temp=L[i],j=i-1; j>0; j--){
if(L[j]>temp) L[j=1]=L[j];//后移
else{
L[j+1]=temp;break;//插入到有序部分最后
}
}
}
return;
}
插入排序是稳定排序:选第一个元素为有序序列,后面的元素和它作比较,比它大就在它后面,比它小就和它交换位置,和它相等,就放在它后面。所以插入排序是稳定的。
最好情形,时间复杂度B(n)=n-1=θ(n).
最坏情形,时间复杂度w(n)=n(n-1)/2=θ(n^2).