插入排序
举例说明
接下来的例子是把数组A从小到大使用插入排序的方法进行排序。
A={5,8,3,9,6,5}
第一步:5,8,3,9,6,5 //8做为key和5比较,8比5大所以
8和5不用换位置。
第二步:5,8,3,9,6,5 //3做为key。先和8比较,3比8小,
因此8和3换位置。当前序列为
5,3,8,9,6,5。3继续和左边的5作比较,
3比5小,因此3和5交换位置。当
前序列为3,5,8,9,6,5。
第三步:3,5,8,9,6,5 //key的位置移动到9的位置了。9和
8比,9比8大。因此,这次执行不需
要换位置。
第四步:3,5,8,9,6,5 //key的位置移动到6的位置了。6和
9比,9比6大。因此,9和6交换位
置要换位置。当前序列为3,5,8,6,9,5.
6继续和8比较,6比8小。所以6和
8换位置。当前序列为3,5,6,8,9,5.
第五步:3,5,6,8,9,5 //key的位置移动到5的位置了。5和
9比,9比5大。因此,9和5交换位
置要换位置。当前序列为3,5,6,8,5,9.
8继续和5比较,5比8小。所以5和
8换位置。当前序列为3,5,6,5,8,9。5
继续跟6比较,比6小。因此5和6
换位置。当前序列为3,5,5,6,8,9。5和
5比较,比不出大小了。所以本次比
较到此结束。
当前序列为3,5,5,6,8,9。序列已经遍历完了,因此最终的排序结果为3,5,5,6,8,9。
算法分析
接下来我们分析算法的时间复杂度。
伪代码
我们假定第i行执行的时间是C i。
求和时间T(n)
算法时间分析
接下来我们来分析,最好和最坏情况下,插入排序所用的时间。假设我们的排序都是从小到大进行排序(当然也可以从大到小进行排序)。
最好情况
最好的情况指已经排好序的情况下。第4行运行的次数为n-1次。
所以T(n)= C1*(n-1)+ C2*(n-1) + C3*(n-1)+ C4*(n-1)+C7*(n-1),从该函数可以看出来,T(n) 为线性函数。
最坏情况
实现及测试
#include<stdio.h> voidinsert_sort(int *a,int count){ for(int i=1;i<count;++i){ int key = a[i]; int j = i-1; while((j>=0)&&(a[j]>key)){ a[j+1] = a[j]; j--; } a[j+1]= key; } } int main(){ int a[10]={1,4,5,2,7,80,12,7,8,10}; for(int i = 0;i<10;++i){ printf("%d ",a[i]); } insert_sort(a,10); printf("\n"); for(int i = 0;i<10;++i){ printf("%d ,",a[i]); } }
总结
在实践中,我们真正感兴趣是运行时间的增长率或增长量级。所以我们只考虑公式中最重要的项(比如),当n很大时,低阶项相对来说已经不是很重要了。因此插入排序的最差时间复杂度为.
参考资料
《算法导论》