歸併排序
歸併排序(Merge sort)是建立在歸併操作上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
作爲一種典型的分而治之思想的算法應用,歸併排序的實現由兩種方法:
自上而下的遞歸(所有遞歸的方法都可以用迭代重寫,所以就有了第 2 種方法);
自下而上的迭代;
在《數據結構與算法 JavaScript 描述》中,作者給出了自下而上的迭代方法。但是對於遞歸法,作者卻認爲:
【However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.
然而,在 JavaScript 中這種方式不太可行,因爲這個算法的遞歸深度對它來講太深了。】
和選擇排序一樣,歸併排序的性能不受輸入數據的影響,但表現比選擇排序好的多,因爲始終都是 O(nlogn) 的時間複雜度。代價是需要額外的內存空間。
申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列;
設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;
比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置;
重複步驟 3 直到某一指針達到序列尾;
將另一序列剩下的所有元素直接複製到合併序列尾。
動圖演示
代碼實現
更多算法知識,關注微信公衆號: