插入排序
直接插入排序
直接插入排序就是无序区有和有序区反序的元素,那么就将这个元素插入到有序区中合适的位置,使之成为有序区的元素
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void InsertSort(List &L) { int i,j; int temp; for(i=1;i<L.size;i++) { if(L[i-1]>L[i]) { temp=L[i]; for(j=i-1;j>=0&&L[j]>temp;j--) { L[j+1]=L[j]; } L[j+1]=temp; } } }
|
算法复杂度
最好的情况(全都正序):
比较次数:n-1
移动次数:0
最坏的情况(全都反序):
比较次数:
移动次数:
平均比较和移动之和:
折半插入排序
相比直接插入在查找反序元素位置上提高了查找效率,移动数组元素次数不变,仅仅将分散移动变为集合移动。
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| void BinInsertSort(List &L) { int i,j,temp; int low,high,mid; for(i=1;i<L.size;i++) { if(L[i-1]>L[i]) { temp=L[i]; low=0; high=i-1;
while(low<=high) { mid=(low+high)/2; if(temp<L[mid]) high=mid-1; else low=mid+1; }
for(j=i-1;j>=high+1;j--) { L[j+1]=L[j]; } L[high+1]=temp; } } }
|