基本思想:基於分治法,即把待排序的陣列序列,分為若干個子串行,對每個子串行排序,然後再把所有有序的子串行合併為乙個整體有序的序列。
分析可知,如果拿任何乙個元素作為子串行,那麼所有子串行就已經是有序的,而歸併排序的關鍵就在於如何合併,也就是「歸併」。
歸併排序是外排序,穩定排序,時間複雜度是o(nlogn).
詳細說歸併排序的過程:1個元素的表總是有序的。所以對n個元素的待排序列,每個元素可看成1個有序子表。對子錶兩兩合併生成n/2個子表,所得子表除最後乙個子表長度可能為1 外,其餘子表長度均為2。再進行兩兩合併,直到生成n 個元素按關鍵碼有序的表。
**如下:
非遞迴實現:(經過除錯,該程式有bug,後續修正!)
#includeusing namespace std;
void merge(int* r, int* rf, int i, int m, int n)
while(i <= m) // 如果不等長,就會出現這種情況
rf[k++] = r[i++];
while(j <= n)
rf[k++] = r[j++];
for(int ii = 0; ii < n+1; ii++)
cout<
遞迴實現:
void msort(elemtype *r, elemtype *rf,int s, int t)
} void mergesort_recursive(elemtype *r, elemtype *rf, int n)
參考: 資料結構與演算法之排序演算法(四) 歸併排序
歸併排序 分治思想的運用 原理 將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的,然後再把有序的子串行合併為整天有序序列。分治演算法步驟 第一步 劃分。將原問題劃分為幾個子問題 第二步 遞迴求解。遞迴求解每個子問題 第三步 合併。將求解後的子問題合併...
資料結構排序 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法,時間複雜度是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 基本思想如下所示 經過上面的劃分,從而可以看出經過劃分與歸...