歸併排序(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.歸併排序是一種穩定的...