資料結構 排序 兩路歸併排序演算法

2021-09-05 19:37:38 字數 2176 閱讀 4591

歸併排序(merge sort)是利用"歸併"技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。

1、演算法基本思路

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

(1)合併過程

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

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

(2)動態申請r1

實現時,r1是動態申請的,因為申請的空間可能很大,故須加入申請空間是否成功的處理。

2、歸併演算法

void merge(seqlist r,int low,int m,int high)

//merge

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

1、 自底向上的方法

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

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

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

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

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

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

(2) 二路歸併排序的全過程 (略)

(3) 一趟歸併演算法

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

個有序的子檔案:r

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

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

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

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

具體演算法如下:

void mergepass(seqlist r,int length)

注意:自底向上的歸併排序演算法雖然效率較高,但可讀性較差。

2、自頂向下的方法

採用分治法進行自頂向下的演算法設計,形式更為簡潔。

(1)分治法的三個步驟

設歸併排序的當前區間是r[low..high],分治法的三個步驟是:

①分解:將當前區間一分為二,即求**點

②求解:遞迴地對兩個子區間r[low..mid]和r[mid+1..high]進行歸併排序;

③組合:將已排序的兩個子區間r[low..mid]和r[mid+1..high]歸併為乙個有序的區間r[low..high]。

遞迴的終結條件:子區間長度為1(乙個記錄自然有序)。

(2)具體演算法

void mergesortdc(seqlist r,int low,int high)

{//用分治法對r[low..high]進行二路歸併排序

int mid;

if(low(3)演算法mergesortdc的執行過程 (略)

演算法mergesortdc的執行過程如下圖所示歸樹。    

二、演算法分析

1、穩定性

歸併排序是一種穩定的排序。

2、儲存結構要求

可用順序儲存結構。也易於在鍊錶上實現。

3、時間複雜度

對長度為n的檔案,需進行

4、空間複雜度

需要乙個輔助向量來暫存兩有序子檔案歸併的結果,故其輔助空間複雜度為o(n),顯然它不是就地排序。

注意:若用單鏈表做儲存結構,很容易給出就地的歸併排序

演算法複習之兩路歸併排序

兩路歸併排序 最差時間複雜度 o nlogn 平均時間複雜度 o nlogn 最差空間複雜度 o n 穩定性 穩定 兩路歸併排序 merge sort 也就是我們常說的歸併排序,也叫合併排序。它是建立在歸併操作上的一種有效的排序演算法,歸併操作即將兩個已經排序的序列合併成乙個序列的操作。該演算法是採...

資料結構排序 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法,時間複雜度是o nlogn 它過程為 比較a i 和a j 的大小,若a i a j 則將第乙個有序表中的元素a i 複製到r k 中,並令i和k分別加上1 否則將第二個有序表中的元素a j 複製到r k 中,並令j和k分別加上1,如此迴圈下去,直到...

資料結構 排序演算法之歸併排序

基本思想 將待排序的元素序列分成兩個等長的子串行,再將子串行劃分子串行,直到子串行中只有乙個元素就不用在對子序列繼續進行劃分,將劃分的每個區塊,進行排序,然後再將其歸併到乙個序列中,直到將所有的子串行歸併完成之後,則這個序列就完成了排序。1 基本思想如下所示 經過上面的劃分,從而可以看出經過劃分與歸...