插入排序和归并排序使我们见得比较多的排序算法,插入排序的时间复杂度是O(n2),空间复杂度为1。归并排序的时间复杂度为O(lgn),空间复杂度为n。下面为自己c语言实现的归并排序和插入排序。
1 #include<stdio.h> 2 void mergeSort(int a[],int p,int r); 3 void merge(int a[],int p,int q,int r); 4 void insertSort(int a[]); 5 int main() 6 { 7 int a[9]={9,5,8,6,2,3,1,4,7}; 8 mergeSort(a,0,8);//归并 9 insertSort(a);//插入 10 for(int i=0;i<9;i++) 11 printf("%d ",a[i]); 12 return 0; 13 } 14 void mergeSort(int a[],int p,int r)//归并排序 15 { 16 if(p<r) 17 { 18 int q=(p+r)/2; 19 mergeSort(a,p,q); 20 mergeSort(a,q+1,r); 21 merge(a,p,q,r); 22 } 23 } 24 void merge(int a[],int p,int q,int r)//合并 25 { 26 int l[9],m[9]; 27 int n1=q-p+1; 28 int n2=r-q; 29 int i,j,k; 30 j=k=0; 31 for(i=p;i<=q;i++) 32 l[j++]=a[i]; 33 for(i=q+1;i<=r;i++) 34 m[k++]=a[i]; 35 l[n1]=m[n2]=999; 36 i=j=0; 37 for(k=p;k<=r;k++) 38 { 39 if(l[i]>m[j]) 40 a[k]=m[j++]; 41 else a[k]=l[i++]; 42 } 43 44 } 45 void insertSort(int a[])//插入排序 46 { 47 int i,j,s,tem,p; 48 for(i=1;i<9;i++) 49 { 50 tem = a[i]; 51 p=i;//标记 52 s=i; 53 while(a[p-1] > tem) 54 { 55 p=p-1; 56 if(p==0) 57 break; 58 }//p确定最后tem放置的位置 59 for(j=i;j>p;j--) 60 { 61 a[j]=a[j-1]; 62 } 63 a[p]=tem; 64 65 } 66 }
虽然插入排序的最坏时间比归并排序多,但是在n比较小时插入排序的速度比归并排序的速度快。所以在归并排序中当子问题足够小时,就可以用插入排序来处理子问题的排序,从而提高归并排序的效率。当子问题的大小为小于lgn时,采用插入排序来处理子问题能够提高归并排序的效率。
lgn的确定具体请看http://fangxia722.blog.163.com/blog/static/317290122009112831244671/