2 路歸併排序詳解

2021-06-17 14:44:11 字數 2090 閱讀 3971

2-路歸併排序的核心操作是將一維陣列中前後相鄰的兩個有序序列歸併為乙個有序序列.其時間複雜度為o(nlgn),空間複雜度為o(n).是一種穩定的排序方法.

設兩個有序的子檔案(相當於輸入堆)放在同一向量中相鄰的位置上:r[low..m],r[m+1..high],先將它們合併到乙個區域性的暫存向量r1(相當於輸出堆)中,待合併完成後將r1複製回r[low..high]中。

合併過程

合併過程中,設定i,j和p三個指標,其初值分別指向這三個記錄區的起始位置。合併時依次比較r[i]和r[j]的關鍵字,取關鍵字較小的記錄複製到r1[p]中,然後將被複製記錄的指標i或j加1,以及指向複製位置的指標p加1。

重複這一過程直至兩個輸入的子檔案有乙個已全部複製完畢(不妨稱其為空),此時將另一非空的子檔案中剩餘記錄依次複製到r1中即可。

歸併演算法如下:

void  merge(int * a,int low,int mid,int high)

while(i<=mid)

r[p++]=a[i++];

while(j<=high)

r[p++]=a[j++];

for(p=0,i=low;i<=high;p++,i++)

a[i]=r[p];

delete r;

}

歸併排序

歸併排序有兩種實現方法:自底向上和自頂向下。

(1)自底向上的基本思想

自底向上的基本思想是:第1趟歸併排序時,將待排序的檔案r[1..n]看作是n個長度為1的有序子檔案,將這些子檔案兩兩歸併,若n為偶數,則得到

個長度為2的有序子檔案;若n為奇數,則最後乙個子檔案輪空(不

參與歸併)。故本趟歸併完成後,前

個有序子檔案長度為2,但最

後乙個子檔案長度仍為1;第2趟歸併則是將第1趟歸併所得到的

個有序的子檔案兩兩歸併,如此反覆,直到最後得到乙個長度為n的有序檔案為止。

上述的每次歸併操作,均是將兩個有序的子檔案合併成乙個有序的子檔案,故稱其為"二路歸併排序"。類似地有k(k>2)路歸併排序。

(2)一趟歸併演算法

分析:在某趟歸併中,設各子檔案長度為length(最後乙個子檔案的長度可能小於length),則歸併前r[1..n]中共有

個有序的子檔案:r

[1..length],r[length+1..2length],…,

。注意:

呼叫歸併操作將相鄰的一對子檔案進行歸併時,必須對子檔案的個數可能是奇數、以及最後乙個子檔案的長度小於length這兩種特殊情況進行特殊處理:

① 若子檔案個數為奇數,則最後乙個子檔案無須和其它子檔案歸併(即本趟輪空);

② 若子檔案個數為偶數,則要注意最後一對子檔案中後一子檔案的區間上界是n。

具體演算法如下:

void mergepass(int *a,int n,int length)

region;

//非遞迴實現(感覺跟二叉樹後序遍歷的非遞迴實現很像)

void nonrecursivemergesort(int *a,int len)

else //應該劃分

else //否則應該劃分}}}

//

// 歸併排序(改進版).cpp : 定義控制台應用程式的入口點。

#include "stdafx.h"

#include #include using namespace std;

void printarray(int *a,int n)

else //應該劃分

else //否則應該劃分

} }}

int _tmain(int argc, _tchar* argv)

; int n=sizeof(a)/sizeof(int);

printarray(a,n);

//mergesort(a,n);

nonrecursivemergesort(a,n);

printarray(a,n);

system("pause");

return 0;

}

本文參考:資料結構(c語言 嚴蔚敏版)p283-p284 

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

2 路歸併排序

歸併排序的時間複雜度為o nlog2n 利用二路歸併排序時,需要利用與待排序序列長度相同的陣列作為臨時儲存單元,故該排序方法的空間複雜度o n 由於二路歸併排序中,每兩個有序子串行合併成乙個有序序列時,若分別在兩個有序子串行中出現有相同關鍵字的記錄,則會使前乙個有序子串行中相同關鍵字的記錄先複製,後...

2 路歸併排序

假設初始序列含有n個記錄,則可看成是n個有序子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的有序序列為止,這種排序方法稱為2 路歸併排序。2 路歸併排序中的核心操作是將一維陣列中前後相鄰的兩個有序序列歸併為乙個有序序列...