因爲LeetCode上的算法題不少涉及到一些基礎的數據結構,爲了更好的理解後續更新的一些複雜題目的動畫,推出一個新系列 -----《圖解數據結構》,主要使用動畫來描述常見的數據結構和算法。本系列包括十大排序、堆、隊列、樹、並查集、圖等等大概幾十篇。git
歸併排序(Merge sort)是創建在歸併操做上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。github
做爲一種典型的分而治之思想的算法應用,歸併排序的實現由兩種方法:算法
和選擇排序同樣,歸併排序的性能不受輸入數據的影響,但表現比選擇排序好的多,由於始終都是 O(nlogn) 的時間複雜度。代價是須要額外的內存空間。編程
申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列;數據結構
設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;數據結構和算法
比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置;編程語言
重複步驟 3 直到某一指針達到序列尾;ide
將另外一序列剩下的全部元素直接複製到合併序列尾。性能
首先,將數字分割成兩片區域
將數字分割成兩片區域
。。。。。。
直到每片區域只有一個元素
分割完成
接下來,將分割的每片區域進行合併組合
合併時,按照數字的升序移動,使得合併後的數字在組內按升序排列
當合幷包含多個數字的組時,比較開頭的數字,移動其中較小的數字
好比在動畫中,比較開頭的 4 和 3
其中 4 大於 3, 所以移動 3
按照一樣的邏輯去比較該列剩餘的頭數
4 小於 7 ,因此移動 4
。。。。。。
遞歸的重複組的合併操做,直到全部數字都在一個組中。
完成 歸併排序 啦~
爲了更好的讓讀者用本身熟悉的編程語言來理解動畫,筆者將貼出多種編程語言的參考代碼,代碼所有來源於網上。
若是你是iOS開發者,能夠在GitHub上 github.com/MisterBooo/… 獲取更直觀可調試運行的源碼。
若是你想獲取高清的動畫演示,在 五分鐘學算法 公衆號裏回覆 歸併排序 便可。