歸併排序詳解

2021-10-03 14:48:49 字數 1427 閱讀 9211

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序是一種穩定的排序方法。

歸併排序的實現由兩種方法:

自上而下的遞迴(所有遞迴的方法都可以用迭代重寫,所以就有了第 2 種方法);

自下而上的迭代;

2-路歸併排序

假定待排序表含有 n 個記錄,則可以看成是 n 個有序的子表,每個子表長度為 1, 然後兩兩 歸併,得到⌈n/

2⌉\lceil n/2 \rceil

⌈n/2

⌉個長度為2或1的有序表;再兩兩歸併,……如此重複,直到合併成乙個長度為 n 的有序表為止,這種排序方法稱為2-路歸併排序。

例子:排序49、38、65、97、76、13、27

(1)首先將整個序列的每個關鍵字看成乙個單獨的有序的子串行

(2)兩兩歸併,49 和 38 歸併成 ,65 和 97 歸併成,76 和 13 歸併成, 27 沒有歸併物件

(3)兩兩歸併,歸併成, 和 27 歸併成

(4)兩兩歸併, 和 歸併成

穩定順序儲存和鏈式儲存

c++:

elemtype *b=

(elemtype *

)malloc

((n+1)

*sizeof

(elemtype));

//輔助陣列b(動態分配記憶體)

void

merge

(elemtype a,

int low,

int mid,

int high)

while

(i<=mid)

a[k++

]= b[i++];

//若第乙個表未檢測完,直接將剩下的部分複製過來

while

(j<=high)

a[k++

]= b[j++];

//若第二個表未檢測完,直接將剩下的部分複製過來

}void

mergesort

(elemtype a,

int low,

int high)

}

歸併排序詳解

一.概念 歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。二.基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出堆 中,待合併完成後將r1複製回r low.high 中。合併過程中,設定...

歸併排序詳解

歸併排序的核心思想是將兩個已經排序的序列合併成乙個序列,那如何得到兩個已經排序的序列呢?我們知道,如果乙個序列只有乙個元素,那該序列是已經排序的,這樣我們就可以利用分治的思想,將未排序的序列劃分成更小的序列,只到我們可以很方便的對小序列進行排序 比如劃分到序列只有乙個元素,或者序列很小可以方便的使用...

歸併排序 詳解

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。優點1.歸併排序的效率達到了巔峰 時間複雜度為o nlogn 這是基於比較的排序演算法所能達到的最高境界 2.歸併排序是一種穩定的...