1 #include<stdio.h> 2 #define N 12 3 //length统计数组的长度 返回最后元素的下标 4 int length(int a [N]){ 5 for(int i = 0;i<=N;i++){ 6 if(a[i]==0) return i-1; 7 8 } 9 } 10 //打印输出数组元素 11 void show(int a[N]){ 12 for(int i= 0;i<N;i++){ 13 if(a[i]!=0) printf("%4d",a[i]); 14 15 } 16 17 18 } 19 //写个插入算法,可以拿来测试用 20 void insert(int a[N],int dex ,int value){ 21 for(int i =length(a) ;i>=dex;i--){ 22 a[i+1] = a[i]; 23 24 } 25 a[dex] = value ; 26 } 27 //插入排序 28 void insertsort(int a [N]){ 29 int temp=0; 30 for(int i = 1;i<=length(a);i++){ 31 for(int j = 0;j<i;j++){ 32 if(a[j]>a[i]){ 33 temp = a[j] ; 34 a[j]=a[i] ; 35 a[i]=temp;} //与冒泡算法很相似 但思路上是有所区别的,很好的利用的i下标元素之前数组的有序性。 36 //这里insert(a,j,a[i])函数是没必要的,插入排序的操作实际上还是一个借助中间变量实现的算法,并不需要插入函数,假如一定要使用插入函数,还必须再写一个删除函数配套使用,太麻烦; 37 } //例如对3 2 1 4进行排序,使用insert函数第一轮结果是2 3 2 1 4 ;这里多出了一个2,必须使用删除函数把它删除,下一次循环才能得到正确的结果 38 39 } 40 }
41
42 int main(void){ 43 int a [N] ={2,3,467,1,22,3,5,34,4,7} ;
//手动生成数组a printf("%d\n",length(a));
insertsort(a);
show(a); //输出 1 2 3 3 4 5 7 22 34 467 结果正确 return 0 ;
//此算法的时间复杂度为O(n^2) 当插入的元素比较小,插入标记比较靠前时,temp = a[j] ; a[j]=a[i]; a[i]=temp;这三条语句还是要反复执行很多次的。
//例如对3241进行插入排序,第一次i循环后的结果为2341,第二次循环不执行if语句,第三次循环的过程为1342 --> 1243 --> 1234,这个过程中,因为下标i元素离需要插入的j位置比较远,所以
下标为i的元素反复与j循环中的元素进行交换,i循环中i与需要交换的j位置距离越远,插入排序算法的执行次数就越接近冒泡算法。