歸併排序詳解

2021-07-28 08:23:05 字數 928 閱讀 8205

分治法在每層遞迴時都有三個步驟:

1.分解原問題為若干個子問題,這些子問題是原問題規模較小的例項;

2.解決子問題,遞迴求解各子問題,如果子問題規模足夠小,則直接求解;

3.合併子問題得到原問題的解。

歸併排序完全遵循分治法:

1.分解待排序的n個元素的序列,分成各具有n/2個元素的兩個子串行;

2.使用歸併排序遞迴地排序兩個子串行;

3.合併兩個已排序的子串行得到已排序的答案。

當待排序的子串行只有乙個元素時,遞迴開始「回公升」,這種情況下不要做任何工作,因為長度為1的每個序列都已經排好。

#include using namespace std;

//注意區間狀況是[left, mid], (mid, right];

void merge_test(int* a, int left, int mid, int right)

for (i = 0; i < n2; i++)

l[n1] = 0x3f3f3f3f, r[n2] = 0x3f3f3f3f;//設為無窮大可不必考慮陣列為空的情況

//合併, 從小到大

i = j = 0;

for (int k = left; k <= right; k++)

else

}}//區間為[left, right];

void merge_sort(int* a, int left, int right)

}int main()

//歸併排序,從小到大

merge_sort(a, 0, n - 1);//注意用閉區間

//測試

int flag = 0;

for (int i = 0; i < n; i++)

cout << endl;

}}

歸併排序詳解

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

歸併排序詳解

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

歸併排序 詳解

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