演算法之合併排序 mergeSort

2022-09-02 12:27:13 字數 1393 閱讀 6355

合併排序演算法在結構上是遞迴的,採用分治策略:就是將原有的問題劃分為 n 個規模較小但結構與原問題相似的子問題,遞迴地解決這些子問題,然後合併其結果,就得到原問題的解。

合併排序的模式一般如下:

1.分解:將 n 個元素分解為各含 n/2 個元素的兩個序列;

2.解決:用分治排序法對兩個子串行遞迴地排序;

3.合併:合併兩個已排好序的子串行得到排序結果。

在對子序列遞迴的過程中,當子串行元素數為1時,遞迴結束。

合併排序演算法的時間複雜度為o(nlgn)

1

void 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函式可改為如下:

1

void 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個規模較小而結構與原問題相似的子問題 遞迴地解決這些子問題,然後再合併其結果,就能得到原問題的解。在每一層遞迴上都會有三個步驟 分解 將原問題分解成一系列子問題 解決 遞迴地解決各子問題,若子問題足夠小,則直接求解 合併 將子問題的結果合併成原問題的解。合併排序演算法完全依照...