整活 QYT歸併排序 從二路歸併到三路歸併

2022-09-20 01:09:08 字數 1059 閱讀 3181

閒大發了屬於是。

不過過年就是要整點讓人開心的(?)

歸併排序以分治的思維處理乙個無序的序列。

將序列均分為兩份,若不能再分則直接進入步驟 3

分別排序均分後的兩序列

現在得到的兩個序列都是有序的,每次取出兩個序列中較大/較小的那個放在新有序序列最前的位置即可合併兩個序列

通過主定理分析可得,其平均複雜度及最劣複雜度均為 \(\mathcal (n \log n)\)。

void mergesort(int *a,int l,int r) 

while(p1 <= mid) t[p++] = a[p1++];

while(p2 <= r) t[p++] = a[p2++];

rep(i,l,r) a[i] = t[i];

}

在上面的過程中,我們將序列分成兩份。

考慮合併的過程,每個元素只被加入臨時陣列一次,為 \(\mathcal (n)\) 的。

利用主定理 :

\[\large

t(n) = 3t(\frac) + \mathcal(n) = \mathcal(n \log_3 n)

\]然後你就可以發現這個玩意大常數。

但是這不妨礙它和二路歸併差不多快,於是我們將其命名為 qyt 歸併排序。

這個排序的優點是碼量比歸併大,可以鍛鍊你輸入的速度(?)

以下是亂寫的**。

void qytmergesort(int *a,int l,int r) 

while(p1 <= mid1 && p2 <= mid2)

while(p1 <= mid1 && p3 <= r)

while(p2 <= mid2 && p3 <= r)

while(p1 <= mid1) t[p++] = a[p1++];

while(p2 <= mid2) t[p++] = a[p2++];

while(p3 <= r) t[p++] = a[p3++];

rep(i,l,r) a[i] = t[i];

}

歸併排序(二路歸併)

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

排序 歸併排序(二路歸併)

基本思想 將兩個有序表合併成乙個有序表。將下列兩個已排序的順序表合併成乙個已排序表。順序比較兩 者的相應元素,小者移入另一表中,反覆如此,直至其中任一表都移入另 一表為止。二路歸併排序的基本思想是將兩個有序表合併成乙個有序表。給定排序碼46,55,13,42,94,05,17,70,二路歸併排序過程...

二路歸併排序

不是困難的演算法,不過也是練習了下遞迴。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...