二路歸併排序

2021-08-20 18:07:00 字數 943 閱讀 7732

當出現 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的有...