概念
歸併排序是建立在歸併操作上的一種有效的排序算法。
該算法是採用分治法的一個非常典型的應用。
將已有序的子序列合併,得到完全有序的序列;
即先使每個子序列有序,再使子序列段間有序。
若將兩個有序表合併成一個有序表,稱爲2-路歸併。
使用前提
有序子列的歸併
-
假設有上個表A 、B、C,將有序表A、B插入到C中
-
設置三個指針(並非必須爲指針,可以是任何可以指定位置的結構)Aptr、Bptr、Cptr分別指向A、B、C表的起始位置
-
比較Aptr和Bptr將大的將其放置到Cptr的位置,然後將改變的+1
-
代碼
-
A爲待排序數組(A、B),TmpA爲排序結果臨時存放數組(C),L爲左邊起始位置(Aptr),R右邊的起始位置(Bptr),REnd(右邊數組的長度,左邊的可以計算)
算法思路
歸併排序是將兩個或兩個以上的有序表合併成一個新的有序表
將已有序的子序列合併,得到完全有序的序列;
即先使每個子序列有序,再使子序列段間有序。
適用場景
歸併排序在數據量比較大的時候也有較爲出色的表現(效率上),但是,其空間複雜度O(n)使得在數據量特別大的時候(例如,1千萬數據)幾乎不可接受。
而且,考慮到有的機器內存本身就比較小,因此,採用歸併排序一定要注意。
算法描述
遞歸法(Top-down)
分而治之
分而治之是一種使用遞歸解決問題的算法,主要的技巧是將一個大的複雜的問題劃分爲多個子問題,而這些子問題可以作爲終止條件,或者在一個遞歸步驟中得到解決,所有子問題的解決結合起來就構成了對原問題的解決
原理如下(假設序列共有n個元素):
申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列
設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置
比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
重複步驟3直到某一指針到達序列尾
將另一序列剩下的所有元素直接複製到合併序列尾
僞碼描述
生成臨時存放空間,並向遞歸算法傳入長度
遞歸算法:每次分半歸併到臨時數組,然後將臨時數組寫回待排數組
迭代法(Bottom-up)
迭代
將待排序列A進行不斷的歸併,歸併結果存放在A與臨時數組TmpA中(如果每次迭代都開闢臨時數組將會造成巨大的空間佔用),最後將排好序的結果返回在A中即可
原理如下(假設序列共有n個元素):
** 將序列每相鄰兩個數字進行歸併操作,形成ceil(n/2)個序列,排序後每個序列包含兩/一個元素
** 若此時序列數不是1個則將上述序列再次歸併,形成ceil(n/4)個序列,每個序列包含四/三個元素
** 重複步驟2,直到所有元素排序完畢,即序列數爲1
僞碼描述
總控算法:控制迭代算法的執行
迭代算法