合并排序就是通过分治策略对n个元素进行排序,其算法复杂度为θ(nlg(n)),比插入排序复杂度要低,下面讲解两种排序方式的实现.
input :a[10]={7,3,6,8,4,9,2,1,12,5}
output :依照从小到大的顺序输出.
首先给出合并排序的思想,是假设两段已经排好了序,再对其合并得出最终的序列的过程.其中的关键是在于合并过程,就是不断的套用子程序。
1 /*分割*/ 2 void Mergesort (int a[],int left,int right) 3 { if(left<right) 4 int i=(left+right)/2; 5 Mergesort(a,left,i); 6 Mergesort(a,i+1,right); 7 Merge(a,b,left,i,right); 8 }
1 /*合并*/ 2 void Merge(int a[],int b[],int p,int q,int r) 3 『 4 int n1=q-p+1; 5 int n2=r-p; 6 int L[n1+1];int R[n2+1]; 7 for (int i=1,i<=n1,i++) 8 L[i]=a[p=i-1]; 9 for (int j=1,j<=n2,j++) 10 R[j]=a[q+j]; 11 int i=1,j=1; 12 for(int k=p,k<=r,k++) 13 { if(L[i]<=R[j]; 14 b[k]=L[i];i=i+1; 15 else b[k]=R[i];j=j+1; 16 }
而插入排序的思想则是在一段序列a[1...j-1]中插入一个a[j]的值,相应的代码可以写成:
1 /*输入a[n]*/ 2 for (int j=1,j<n,j++) 3 { int key=a[j];} 4 for (i=j-1,i>=0,i--) 5 { if (key<a[i]) 6 {a[i+1]=a[i];} 7 a[i+1]=key; 8 }
插入的思想很好理解,就是将a[j]与前面的值进行比较,算法复杂度为θ(n2).