一張圖搞懂歸并排序

歸并排序的特點是:?先拆分, 再排序。

而使用柱狀遞歸樹圖可以讓你非常清晰地感受到歸并排序的這個特點。


1 柱狀遞歸樹圖

什么是柱狀遞歸樹圖呢??

柱狀遞歸樹圖?就是?柱狀圖+樹圖 組合而成

先上一張歸并排序的效果圖快速預覽下

柱狀圖可以很好地把數(shù)字的大小排列體現(xiàn)出來。

樹圖就可以把每次遞歸之后, 數(shù)字的大小排列變化很好地體現(xiàn)出來。

遞歸的本質就是樹!

這張圖中每一個柱狀圖都表示一次遞歸后的結果,?我們可以非常直觀地看到遞歸的模樣!

希望看完本文后, 再提起歸并排序時, 首先出現(xiàn)在你腦海里的,會是一個柱狀遞歸樹的動畫 : )

下面先說歸并排序的遞歸實現(xiàn)方式:?先遞歸二分, 再排序合并蹂随。


2 遞歸實現(xiàn)

照例我們先對一個長度為16的亂序數(shù)組進行歸并排序

let data = [13,11,7,4,9,8,15,6,5,3,14,2,10,1,16,12]

使用遞歸的實現(xiàn)方式,我們先對數(shù)組進行二分因惭。

把數(shù)組中16個元素先分出8個來, 再從8個中分出4個岳锁,一直遞歸地對左邊的數(shù)組二分下去:

直到還剩下1個數(shù)字時, 遞歸終止,也就是下圖這種情況蹦魔。

終止遞歸后, 回到上一層, 開始對右半部分的數(shù)組進行二分操作激率。

直到右邊的數(shù)組也剩下1個數(shù)字時, 遞歸終止,也就是下圖這種情況勿决。

如果我們對整個數(shù)組遞歸地執(zhí)行二分操作乒躺,執(zhí)行結束之后,?就是下圖的效果:

說多無益, 直接看動圖:

從動畫可以反推出代碼應該是下面這樣的:

理解了遞歸二分低缩,接下來講講歸并排序的第二步嘉冒,排序合并曹货。

3 排序合并

歸并排序是怎么把兩個小的數(shù)組合并回大的數(shù)組呢?

排序合并 顧名思義就是先排序 后合并讳推。

這一步也是歸并排序的重頭戲顶籽,實現(xiàn)歸并排序時我們也會花更多的精力在這一步。

我們先來看看最簡單的情況:兩個長度一的數(shù)組怎么合并為一個有序數(shù)組银觅。

看下圖紅色部分, 我們先對左邊的數(shù)組和右邊的數(shù)組進行比較:

比較小的元素先移到上層數(shù)組中:

最后完成排序合并礼饱,可以看到新合并的數(shù)組是一個有序數(shù)組:

接下來看看復雜點的情況,兩個長度為4的數(shù)組合并為一個數(shù)組:

通過下面這個簡單的動畫演示究驴,我們可以一窺究竟镊绪。

詳細的代碼實現(xiàn)我們在下次更新再進行講解。這里先大概說下邏輯纳胧,我們可以把左右兩個數(shù)組想象成左右兩個指針镰吆。兩個指針一開始都是指向數(shù)組的初始位置0帘撰,然后兩個指針所指向的元素開始比較大小跑慕,較小的那個數(shù)會移到上層數(shù)組中,并且該數(shù)字所在的指針向右移動一格摧找,依次類推核行。

現(xiàn)在我們在上面的遞歸函數(shù)里加入排序合并這步操作。

于是就變成了下面這樣蹬耘,是不是和你想象中的一樣呢芝雪?這里只放左半部分的動畫。

遞歸二分 + 排序合并综苔,這就是歸并排序算法完整的遞歸實現(xiàn)惩系。

最終排序效果圖:

4 非遞歸實現(xiàn)

歸并排序還可以使用非遞歸的方式實現(xiàn),也就是自底向上如筛,先遍歷拆分, 再排序合并堡牡。

非遞歸的實現(xiàn)方式,采用自底向上的思路杨刨。

對數(shù)組進行

1個一組進行拆分-排序合并;

2個一組進行拆分-排序合并;

4個一組進行拆分-排序合并;

8個一組的方式進行拆分......

這些我們都會在下次更新的文章中配合動畫進行詳細講解晤柄。

最終的排序結果:

5 后續(xù)

下一篇更新將會重點講解歸并排序的實現(xiàn)代碼。

相信大家都可以看到妖胀,?歸并排序的實現(xiàn)重心是第二步“排序合并”芥颈,下一章也會通過動畫對這個過程進行詳細解析。

最后赚抡,目前的樹圖還是有一些缺陷的爬坑,比如樹的節(jié)點之間缺少了線,比如非遞歸實現(xiàn)的一些布局問題等等涂臣,這些問題都會在后續(xù)慢慢完善:)

溫馨提示

本文的動畫使用的是d3.js?和?anim.js妇垢,如果對本文的動畫代碼感興趣,可以關注公眾號"字節(jié)武裝"。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闯估,一起剝皮案震驚了整個濱河市灼舍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涨薪,老刑警劉巖骑素,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刚夺,居然都是意外死亡献丑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門侠姑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來创橄,“玉大人,你說我怎么就攤上這事莽红⊥孜罚” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵安吁,是天一觀的道長醉蚁。 經常有香客問我,道長鬼店,這世上最難降的妖魔是什么网棍? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮妇智,結果婚禮上滥玷,老公的妹妹穿的比我還像新娘。我一直安慰自己巍棱,他們只是感情好惑畴,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拉盾,像睡著了一般桨菜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捉偏,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天倒得,我揣著相機與錄音,去河邊找鬼夭禽。 笑死霞掺,一個胖子當著我的面吹牛,可吹牛的內容都是我干的讹躯。 我是一名探鬼主播菩彬,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼缠劝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骗灶?” 一聲冷哼從身側響起惨恭,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耙旦,沒想到半個月后脱羡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡免都,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年锉罐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绕娘。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡脓规,死狀恐怖,靈堂內的尸體忽然破棺而出险领,到底是詐尸還是另有隱情侨舆,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布舷暮,位于F島的核電站态罪,受9級特大地震影響噩茄,放射性物質發(fā)生泄漏下面。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一绩聘、第九天 我趴在偏房一處隱蔽的房頂上張望沥割。 院中可真熱鬧,春花似錦凿菩、人聲如沸机杜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椒拗。三九已至,卻和暖如春获黔,著一層夾襖步出監(jiān)牢的瞬間蚀苛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工玷氏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堵未,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓盏触,卻偏偏與公主長得像渗蟹,于是被迫代替她去往敵國和親块饺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容