兩路歸併排序

簡介

一般來說,排序算法主要被分爲兩類,即基於比較的算法和基於非比較的算法。插入排序,冒泡排序和希爾排序是基於比較模型的。這三個算法的問題是它們的複雜度都是O(n^2),所以它們非常慢。

那麼有沒有比O(n^2)更快的排序列表的方法呢?答案是有的,下面就讓我們看看這麼一個算法。

之前提到的三個算法(插入、冒泡和希爾)的共同特點是,我們是從原始列表裏把元素兩兩取出,然後進行比較的
在這裏插入圖片描述
插入排序和冒泡排序使用了太多的比較,這也是歸併排序需要克服的地方

在原始列表中進行比較不是最好的方式,而且我們也不需要這麼做。作爲替代做法,我們可以嘗試將列表分成更小的子列表然後排序他們。在排序完更小的子列表以後(這麼做比直接排序整個原始列表要簡單),我們可以嘗試將小的子列表合併成一個有序列表。這個技術就是典型的“分治”法(分而治之)。

一般來說,如果一個問題太難以至於無從下手,我們可以嘗試將它分成較小的子問題,然後嘗試解決這些子問題。然後我們可以將子問題的結果合併起來(從而解決原始問題)。
在這裏插入圖片描述

如果排序大列表太困難,我們可以將它分割成更小的子列表,然後排序它們

歸併排序是一個基於分治法的比較排序算法。目前看來還不錯,當我們有一個非常大的列表需要排序,顯然,如果將列表分成兩個子列表,然後再排序會更好些。如果等分以後還是太大,我們就繼續分割,直到可以很簡單地排序爲止(參見下圖)。

在這裏插入圖片描述

“歸"與"並”

一個恰當的比喻

"歸併排序"類似“比武擂臺賽”:無論參賽者有多少人,主辦方都可以讓他們亮亮在擂臺上比試,第一輪的獲勝者再兩兩分組,繼續比試,一直決出冠軍爲止
在這裏插入圖片描述

歸併排序

歸併排序的與上面的類似又有不同

就像是組織一場元素之間的“比武大會”,這場比武大會分成兩個階段:

歸[分組]

第一步就是要把逐層的折半分組
在這裏插入圖片描述

既然分了組,接下來就要開始“比武”了。

歸併排序和擂臺賽有一個很大的不同,就是擂臺賽只需要決定誰是老大,而並不關心誰做老二和老三;歸併排序的要求複雜一些,需要確定每一個元素的排列位置。

因此,當每個小組內部比較出先後順序以後,小組之間會展開進一步的比較和排序,合併成一個大組;大組之間繼續比較和排序,再合併成更大的組…最終,所有元素合併成了一個有序的集合。
在這裏插入圖片描述
這個比較與合併的過程叫做歸併,對應英文單詞merge,這正是歸併排序名字的由來。

如何將兩個有序集合合併成一個有序的大集合?

在這裏插入圖片描述
3步:
第一步,創建一個額外大集合用於存儲歸併結果,長度是兩個小集合之和。(p1,p2,p是三個輔助指針,用於記錄當前操作的位置)
在這裏插入圖片描述
第二步,從左到右逐一比較兩個小集合中的元素,把較小的元素優先放入大集合。
由於1<2,所以把元素1放入大集合,p1和p各右移一位:
在這裏插入圖片描述
由於2<3,所以把元素2放入大集合,p2和p各右移一位:
在這裏插入圖片描述
由於3<7,所以把元素3放入大集合,p1和p各右移一位:
在這裏插入圖片描述
由於5<7,所以把元素5放入大集合,p1和p各右移一位:
在這裏插入圖片描述
由於6<7,所以把元素6放入大集合,p1和p各右移一位:
在這裏插入圖片描述
此時左側的小集合已經沒有元素可用了。

第三步,從另一個還有剩餘元素的集合中,把剩餘元素按順序複製到大集合尾部。
在這裏插入圖片描述

好與壞

爲什麼歸併排序如此有用

快捷和穩定

歸併排序成爲一個非常棒的排序算法主要是因爲它的快捷和穩定。它的複雜度即使在最差情況下都是O(n log n)。而快速排序在最差情況下的複雜度是O(n^2),當n=20的時候,它比歸併要慢4.6倍。

在這裏插入圖片描述

規定排序的最好最差最平均的情況下都是(n log n),十分穩定

容易實現

另一個理由是歸併排序很容易實現。誠然,大多數開發者認爲速度快的算法總是難以實現,但是這條守則並不適用於歸併排序的情況。

歸併排序不那麼實用的三個理由

比非比較排序算法慢

歸併算法是基於比較模型的,因此它要比在線性時間裏排序數據的非比較算法要慢。當然,這也與輸入數據有關,所以我們要仔細對待輸入。

在數據基本有序的情況下,它比冒泡和插入排序要慢

再一次提醒,要了解輸入數據的重要性。如果輸入數據基本已經有序,那麼插入和冒泡排序會更快。插入和冒泡排序在最好的情況下複雜度是O(n),然而歸併排序的最好情況是O(n log n)。

作爲總結,我想說在實踐中,歸併排序是最好的排序算法毋庸質疑,因爲它易於實現而且快捷,所以每個開發者都應該牢記它。

歸併排序和堆排序、快速排序的比較

若從空間複雜度來考慮:首選堆排序,其次是快速排序,最後是歸併排序。

若從穩定性來考慮,應選取歸併排序,因爲堆排序和快速排序都是不穩定的。

若從平均情況下的排序速度考慮,應該選擇快速排序。

圖說歸併排序
漫畫:什麼是歸併排序?
歸併排序
排序(7):歸併排序
多路歸併排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章