合併排序演算法在結構上是遞迴的,採用分治策略:就是將原有的問題劃分為 n 個規模較小但結構與原問題相似的子問題,遞迴地解決這些子問題,然後合併其結果,就得到原問題的解。
合併排序的模式一般如下:
1.分解:將 n 個元素分解為各含 n/2 個元素的兩個序列;
2.解決:用分治排序法對兩個子串行遞迴地排序;
3.合併:合併兩個已排好序的子串行得到排序結果。
在對子序列遞迴的過程中,當子串行元素數為1時,遞迴結束。
合併排序演算法的時間複雜度為o(nlgn)
1void merge(int* a, int p, int q, intr)2
14 *(l + n1) =int_max; //插入序列末標誌
1516
for(i = 0; i < n2; i++)
1720 *(r + n2) =int_max; //插入序列末標誌
2122 i = 0
;23 j = 0
;24 k = 0;25
for(k = p; k < r + 1 ;k++)
2632
else
3337
} 38}39
40void mergesort(int* a, int p, int
r)41
50 }
注:1. mergesort(int* a, int p, int r) 和 merge(int* a, int p, int q, int r)中的形參 p, q, r 都是序列 a 的索引,其中子串行 l = (a[p] ~ a[q]),其長度為 q - p + 1;子串行 r = (a[q + 1] ~ a[r]),其長度為 r - (q + 1) - 1 即 r - q;
2.在上述**中都插入了 序列標誌數,這個數預設為∞,但在實際應用中,該數有可能會出現在應用序列中,merge函式可改為如下:
1void merge(int* array, int p, int q, intr)2
14//
*(l + n1) = int_max;
1516
for(j = 0; j < n2; j++)
1720
//*(r + n2) = int_max;
2122 i = 0
;23 j = 0
;24 k = 0;25
for(k = p; k < r + 1 ;k++)
2632
else
if(j > (n2 - 1
))33
37else
3844
else
4549}50
} 51 }
基本排序演算法之4 歸併排序mergesort
歸併排序理論上時間複雜度只有o nlogn 但是其中存在過多臨時記憶體分配和copy操作而不適用於記憶體排序,卻是外部排序的基本思路。下面是我的實現 include include includeusing namespace std int g 0 a,b is input array c is ...
演算法之合併排序
合併排序演算法是用分治策略實現對n個元素進行排序的演算法。基本思想 將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成要求的排好序的集合。歸併操作的工作原理如下 第一步 申請空間,使其大小為兩個已經 排序序列之和,該空間用來存放合併後的序列 第二步 設定兩...
演算法之合併排序
分治法,將原問題劃分成n個規模較小而結構與原問題相似的子問題 遞迴地解決這些子問題,然後再合併其結果,就能得到原問題的解。在每一層遞迴上都會有三個步驟 分解 將原問題分解成一系列子問題 解決 遞迴地解決各子問題,若子問題足夠小,則直接求解 合併 將子問題的結果合併成原問題的解。合併排序演算法完全依照...