合併排序(C語言實現

2022-02-19 04:24:28 字數 1689 閱讀 3431

遞迴演算法是把乙個問題分解成和自身相似的子問題,然後再呼叫自身把相應的子問題解決掉。這些演算法用到了分治思想。其基本模式如下:

分解:把乙個問題分解成與原問題相似的子問題

解決:遞迴的解各個子問題

合併:合併子問題的結果得到了原問題的解。

現在就用遞迴演算法,採用上面的分治思想來解合併排序

合併排序(非降序)

分解:把合併排序分解成與兩個子問題

偽**:

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, int

e)

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...