遞迴演算法是把乙個問題分解成和自身相似的子問題,然後再呼叫自身把相應的子問題解決掉。這些演算法用到了分治思想。其基本模式如下:
分解:把乙個問題分解成與原問題相似的子問題
解決:遞迴的解各個子問題
合併:合併子問題的結果得到了原問題的解。
現在就用遞迴演算法,採用上面的分治思想來解合併排序。
合併排序(非降序)
分解:把合併排序分解成與兩個子問題
偽**:
merge_sort(a, begin, end)解決:遞迴的解各個子問題,if begin
then mid
) merge_sort(a, begin, mid)
merge_sort(a, mid+1
, end)
merge(a, begin, mid, end)
每個子問題又繼續遞迴呼叫自己,直到
"begin這一條件不滿足時,即
"begin==end"
時,此時只有乙個元素,顯然是有序的,這樣再進行下一步合併。
合併:合併的子問題的結果有個隱含問題,即各個子問題已經是排好序的了(從兩個氮元素序列開始合併)。做法是比較兩個子串行的第乙個元素小的寫入最終結果,再往下比較,如下圖所示:
圖中:待排序陣列為2 4 6 1 3 5
把2 4 6
和 1 3 5
分別存到乙個陣列中,比較兩個陣列的第乙個元素大小小者存於大陣列中,直到兩小陣列中元素都為
32767.
這裡32767
味無窮大,因為
c語言中
int型別是
32位,表示範圍是
-32768-----32768
。用無窮大作為靶子可以減少對兩個小陣列是否為空的判斷,有了靶子,直接判斷大陣列元素個數次就排完了。
在整個過程中執行過程示如下圖:
分解+執行時自上向下,合併時自下向上。
**奉上:
#include void merge(int *a, int b, int m, inte)
for (i=0; i< r; i++)
l[l] = 32767
; r[r] = 32767
; l = 0
; r = 0
;
for(i=0; i< e-b+1; i++)
else
}} void merge_sort(int *a, int b, inte)}
intmain()
return0;
}
C語言實現歸併排序
歸併排序 時間複雜度 o nlogn 空間複雜度 o n 穩定性 穩定 實現原理 採用分治法 divide and conquer 將已有序的子串行合併,得到完全有序的序列,即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,也叫二路歸併。實現 採用遞迴方法實現 include...
歸併排序 C語言實現
merging sort 就是將兩個或兩個以上的有序表合併成一 個有序表的過程。將兩個有序表合併成個有序表的過程稱為2 路歸併,2 路歸併最為簡單和常用。演算法思想 假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再...
C語言實現歸併排序
歸併排序演算法完全遵循分治模式 偽 對分組歸併 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...