Swift經典排序算法-歸併排序法

歸併排序

歸併排序(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) 的時間複雜度。代價是需要額外的內存空間。

  1. 算法步驟

申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列;

設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;

比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置;

重複步驟 3 直到某一指針達到序列尾;

將另一序列剩下的所有元素直接複製到合併序列尾。

  1. 動圖演示
    在這裏插入圖片描述

  2. 代碼實現
    在這裏插入圖片描述

更多算法知識,關注微信公衆號:在這裏插入圖片描述