直接插入排序
基本思想:
- 每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,直到全部记录完成。
- 在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。
动画演示:
算法实现:
void InsertSort(int a[],int n){
int i,j;
for(i=2;i<=n;i++){
if(a[i]<a[i-1]){
a[0]=a[i];
for(j=i-1;a[0]<a[j];--j){
a[j+1]=a[j];
}
a[j+1]=a[0];
}
}
}
算法性能分析:
- 空间效率:仅使用了常数个辅助单元,因此空间复杂度为O(1)。
- 时间效率:
- 最好情况:表中元素已经有序,此时每插入一个元素,都只需要比较一次而不用移动元素,时间复杂度为O(n)。
- 最坏情况:表中元素顺序刚好与排序结果中的元素顺序相反(逆序)。对第i个元素,比较次数是i次,移动次数是i+1,表中n个元素执行比较和移动的总次数为:
∑ 2 n i + ( i + 1 ) = n 2 + 2