二路歸併排序(分治,黑盒劃分, c )

2021-10-24 11:12:08 字數 1404 閱讀 3401

思想:二路歸併排序利用分治的思想,化繁為簡,將陣列分成乙個個的元素,而後兩兩合併成新的陣列片段,最後再將陣列片段兩兩合併,直到合併成乙個陣列為止。

附上**:

主要有兩個函式,merge是將兩個陣列片段(即datas[low]到datas[mid],datas[mid + 1] 到datas[high])合併起來,buffers陣列暫存資料。比較容易理解。

void

merge

(int datas,

int buffers,

int low,

int mid,

int high)

else

}while

(i <= mid)

while

(j <= high)

}

之後還有乙個mergesort函式,這個函式主要用來遞迴處理資料。記得最後要把buffers的資料回寫到datas裡,因為合併的時候要用的是兩個有序的陣列片段。附上**:

void

mergesort

(int datas,

int buffers,

int low,

int high)

}}

完整**:

#include

#include

#include

using

namespace std;

#pragma warning(disable:4996);

void

merge

(int datas,

int buffers,

int low,

int mid,

int high)

else

}while

(i <= mid)

while

(j <= high)

}void

mergesort

(int datas,

int buffers,

int low,

int high)}}

intmain()

;int b[7]

;mergesort

(a, b,0,

6);for

(auto i : a)

return0;

}

時間複雜度分析:

當有n個需要排序的數時,執行log2n次歸併,每次歸併執行不超過n次比較,所以時間複雜度為nlog2n。

穩定性:

歸併排序是穩定排序。看第一張圖就知道,他不會打亂相等元素的順序。

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...

二路歸併排序

不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...

二路歸併排序

二路歸併排序是將兩個有序表合併成乙個有序表的排序方法。其基本思想為 序列中有 n個記錄,可以看作為 n個有序子串行,每個序列長度為 1。首先將每相鄰的兩個記錄合併,得到 n 2 個較大的有序子串行,每個序列長度為 2。再將上述子串行兩兩合併,得到 n 2 2 個有序子串行,直至得到乙個長度為 n的有...