閒大發了屬於是。
不過過年就是要整點讓人開心的(?)
歸併排序以分治的思維處理乙個無序的序列。
將序列均分為兩份,若不能再分則直接進入步驟 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...