合併排序

合併排序就是經過分治策略對n個元素進行排序,其算法複雜度爲θ(nlg(n)),比插入排序複雜度要低,下面講解兩種排序方式的實現.算法

input :a[10]={7,3,6,8,4,9,2,1,12,5}spa

output :依照從小到大的順序輸出.code

首先給出合併排序的思想,是假設兩段已經排好了序,再對其合併得出最終的序列的過程.其中的關鍵是在於合併過程,就是不斷的套用子程序。blog

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).input

相關文章
相關標籤/搜索