【圖解數據結構】 一組動畫演示歸併排序

前言

因爲LeetCode上的算法題不少涉及到一些基礎的數據結構,爲了更好的理解後續更新的一些複雜題目的動畫,推出一個新系列 -----《圖解數據結構》,主要使用動畫來描述常見的數據結構和算法。本系列包括十大排序、堆、隊列、樹、並查集、圖等等大概幾十篇。git

歸併排序(Merge sort

歸併排序(Merge sort)是創建在歸併操做上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。github

做爲一種典型的分而治之思想的算法應用,歸併排序的實現由兩種方法:算法

  • 自上而下的遞歸(全部遞歸的方法均可以用迭代重寫,因此就有了第 2 種方法);
  • 自下而上的迭代;

和選擇排序同樣,歸併排序的性能不受輸入數據的影響,但表現比選擇排序好的多,由於始終都是 O(nlogn) 的時間複雜度。代價是須要額外的內存空間。編程

算法步驟

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

  2. 設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;數據結構和算法

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

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

  5. 將另外一序列剩下的全部元素直接複製到合併序列尾。性能

來源:github.com/hustcc/JS-S…動畫

算法演示

排序動畫過程解釋

  1. 首先,將數字分割成兩片區域

  2. 將數字分割成兩片區域

  3. 。。。。。。

  4. 直到每片區域只有一個元素

  5. 分割完成

  6. 接下來,將分割的每片區域進行合併組合

  7. 合併時,按照數字的升序移動,使得合併後的數字在組內按升序排列

  8. 當合幷包含多個數字的組時,比較開頭的數字,移動其中較小的數字

  9. 好比在動畫中,比較開頭的 4 和 3

  10. 其中 4 大於 3, 所以移動 3

  11. 按照一樣的邏輯去比較該列剩餘的頭數

  12. 4 小於 7 ,因此移動 4

  13. 。。。。。。

  14. 遞歸的重複組的合併操做,直到全部數字都在一個組中。

  15. 完成 歸併排序 啦~

代碼實現

爲了更好的讓讀者用本身熟悉的編程語言來理解動畫,筆者將貼出多種編程語言的參考代碼,代碼所有來源於網上。

C++代碼實現

C++代碼實現

Java代碼實現

Java代碼實現

Python代碼實現

Python代碼實現

JavaScript代碼實現

JavaScript代碼實現

若是你是iOS開發者,能夠在GitHub上 github.com/MisterBooo/… 獲取更直觀可調試運行的源碼。

若是你想獲取高清的動畫演示,在 五分鐘學算法 公衆號裏回覆 歸併排序 便可。

相關文章
相關標籤/搜索