當出現 i+2*len>n 時,則該趟mergepass()的子表數目為奇數,最後乙個a[⌈n/len⌉ ,n-1]無需和其他子表歸併,直到若干趟mergepass()後,只剩兩個子表時,將最後兩個子表合併。
#include using namespace std;
void merge(int a,int low,int mid,int high) //
while(i<=mid)
tmp[k++]=a[i++];
while(j<=high)
tmp[k++]=a[j++];
for(k=0,i=low;i<=high;k++,i++)
a[i]=tmp[k];
delete tmp;}/*
若子表個數為奇數,則最後乙個子表無須和其他子表歸併(即本趟輪空);
若子表個數為偶數,則需要注意到最後乙個子表的區間上界是n-1
*/void mergepass(int a,int len,int n)
void mergesort(int a,int n)
int main()
; cout<
for(int i=0;i<10;i++)
cout<
cout<
mergesort(a,10);
cout<
for(int i=0;i<10;i++)
cout<
cout<
return 0;
}
歸併排序(二路歸併)
歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...
二路歸併排序
不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...
二路歸併排序
二路歸併排序是將兩個有序表合併成乙個有序表的排序方法。其基本思想為 序列中有 n個記錄,可以看作為 n個有序子串行,每個序列長度為 1。首先將每相鄰的兩個記錄合併,得到 n 2 個較大的有序子串行,每個序列長度為 2。再將上述子串行兩兩合併,得到 n 2 2 個有序子串行,直至得到乙個長度為 n的有...