(2 路)歸併排序

2021-10-02 03:58:33 字數 1090 閱讀 6944

2-路歸併的原理:將序列兩兩分組,將序列歸併為 n/2 (向上取整)個組,組內單獨排序;然後將這些陣列再兩兩歸併,生成 n/4(向上取整)個組,組內再單獨排序;以此類推,直到只剩下乙個組為止。

歸併排序的事件複雜度為 o(nlogn).

2-路歸併的遞迴寫法:

#include const int maxn = 100;

//將陣列 a 的[l1, r1] 與 [l2, r2] 區間合併為有序區間(此處 l2 即為 r1 + 1)

void merge (int a, int l1, int r1, int l2, int r2) else }

while (i <= r1) temp[index++] = a[i++]; //將 [l1, r1] 的剩餘元素加入序列 temp

while (j <= r2) temp[index++] = a[j++]; //將 [l2, r2] 的剩餘元素加入序列 temp

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

} //將 array 陣列當前區間 [left, right] 進行歸併排序

void mergesort (int a, int left, int right)

}int main()

mergesort(a, 0, k - 1);

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

return 0;

}

2-路歸併的非遞迴實現:

2-路歸併的非遞迴實現 主要考慮到(這樣一點):每次分組時組內元素的個數上限都是 2 的冪次。於是就可以想到這樣的思路:令步長 step 的初值為 2,然後將陣列中每 step 個元素作為一組,將其內部進行排序(即把左 step / 2 個元素與右 step / 2 個元素合併,而若元素個數不超過 step / 2,則不操作);再令 step 乘以 2,重複上面的操作,知道 step / 2 超過元素個數 n。

**如下:

void mergesort (int a) 

} }}

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

2 路歸併排序

歸併排序的時間複雜度為o nlog2n 利用二路歸併排序時,需要利用與待排序序列長度相同的陣列作為臨時儲存單元,故該排序方法的空間複雜度o n 由於二路歸併排序中,每兩個有序子串行合併成乙個有序序列時,若分別在兩個有序子串行中出現有相同關鍵字的記錄,則會使前乙個有序子串行中相同關鍵字的記錄先複製,後...

2 路歸併排序

假設初始序列含有n個記錄,則可看成是n個有序子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的有序序列為止,這種排序方法稱為2 路歸併排序。2 路歸併排序中的核心操作是將一維陣列中前後相鄰的兩個有序序列歸併為乙個有序序列...