歸併排序演算法完全遵循分治模式:
偽**:
//對分組歸併
merge(a, p, q, r)
n1 = q-p+1
n2 = r-q
let l[1....n1+1] and r[1....n2+1] be new arrays
for i =1 to n1
l[i] = a[p+i-1]
for j=1 to n2
r[j] = a[q+j]
l[n1+1] = ∞
l[n2+1] = ∞
i=1j=1
for k =p to r
if l[i]<=r[j]
a[k] = l[i]
i = i + 1
else
a[k]=r[j]
j = j+1
//歸併排序
merge-sort(a,p,r)
if p < r
q =⌊(p+r)/2⌋
merge-sort(a, p, q)
merge-sort(a, q+1, r)
merge(a, p, q, r)
c語言實現:
//使用c語言實現歸併排序
#include
#include
#include
#include
//對分組歸併
//假設子陣列a[p..q]和a[q+1..r]都已排好序,合併這兩個子陣列形成單一的已排好序的子陣列並代替當前的子陣列a[p..r]
//待合併元素的總數是n=r-p+1
void
merge
(int a,
int p,
int q,
int r)
else
}free
(l);
free
(r);
}//歸併排序
若對遞迴過程不太了解,建議在ide中使用除錯模式跑一遍**。
遞迴樹及時間複雜度分析:
通過將t(n)分解成由遞迴式所確定的它的組成部分來繼續擴充套件樹中的每個結點,直到問題規模下降到1,每個子問題只要代價c。
在(d)部分,完全擴充套件了的遞迴樹具有lgn+1層(如圖所示,其高度為lgn),每層將貢獻總代價cn。所以總代價為cnlgn+cn,它就是θ(nlgn)
C語言實現歸併排序
歸併排序 時間複雜度 o nlogn 空間複雜度 o n 穩定性 穩定 實現原理 採用分治法 divide and conquer 將已有序的子串行合併,得到完全有序的序列,即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,也叫二路歸併。實現 採用遞迴方法實現 include...
歸併排序 C語言實現
merging sort 就是將兩個或兩個以上的有序表合併成一 個有序表的過程。將兩個有序表合併成個有序表的過程稱為2 路歸併,2 路歸併最為簡單和常用。演算法思想 假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再...
歸併排序的C語言實現
歸併排序的核心思想是 divide and conquer 演算法,即將要解決的size為n的問題,分成a個size為n b的子問題,這些子問題的結果經過o n d 的時間複雜度合併,即可解決最初的問題。所以,這一類的演算法,複雜度計算公式為 t n a t n b o n b 經過幾天的努力,終於...