歸併,即「遞迴合併」。
q:我們排序的目的是什麼?
a:讓無序的序列變得有序。
比如說,下面有乙個序列:
排序前排序後
7654321
1234567
如果我們將這個序列從中間附近分開,分成兩個子串行,想辦法讓這兩個子串行變得有序。然後再把兩個有序的子串行合併成乙個有序的子串行,那麼我們的排序不就完成了嗎?
如下圖:
這樣乙個大的任務被分成了兩個子任務:對兩個子串行進行排序
排序前排序後
7654
4567
321123
很容易發現,這兩個子任務和原來的任務沒有本質區別,只是規模變得更小了。可以對這兩個子任務再次進行拆分,在**實現上,這就是遞迴的操作。
乙個基本事實:當序列中只有乙個元素時,它是乙個有序的序列
有了這個基本事實,不難想出:只要經過足夠多次數的分割,一定會將序列分成只有乙個元素的序列,這就是遞迴的出口。
如此,可以給出歸併排序主體思想的**:
這個**十分簡潔:
void
mergesort
(int arr,
int start,
int end,
int temp)
//傳入的引數:待排序陣列,起始下標,終止下標,輔助陣列temp
那麼,如何進行合併的操作呢?
用兩個下標(i,j),分別指向兩個有序序列的起始點,再用乙個下標(k),指向輔助陣列temp的相應位置。
比較i和j對應元素的大小,因為是要排成乙個遞增的序列,選取較小的賦值給temp[k],再將這個下標和k都加1。
當兩個序列都走完後,將temp中的元素複製回待排序的陣列。
歸併排序是個穩定的排序演算法,穩定性由上述操作保證。
下面給出合併操作的**實現:
void
merge
(int arr,
int start ,
int mid,
int end,
int temp)
將合併的**放在排序**之前,就能執行了。
歸併排序是乙個時間複雜度為線性對數階的排序演算法,時間複雜度為:o(n*log2n)(以2為底n的對數),要占用至少n個元素的輔助空間。
資料結構之排序 歸併排序
四 歸併排序 歸併 把若干個有序的數列,合成乙個有序的數列 如二路歸併 void merge int d1,int len1,int d2,int len2,int tmp while i len1 tmp k d1 i while j len2 tmp k d2 j 1,二路歸併排序 迭代法 把待...
資料結構之歸併排序
介紹 歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為o nlogn 歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴 迭代 實現的歸併排序首先進行是兩兩歸...
資料結構之歸併排序
編寫乙個歸併排序程式,並在main函式中驗證結果 歸併排序 merging sort 是利用 歸併 技術進行排序,所謂歸併 是指將若干個已排序好的子表合併成乙個有序表 最簡單的歸併是將兩個有序的子表合併成乙個有序表。假設r low 到r mid 和r mid 1 到r high 是儲存在同乙個陣列中...