歸併排序精講——分治演算法的初步應用
歸併排序,是一種使用分治策略的演算法,主要分為兩種,一種是自頂向下,一種是自底向上。這兩種排序一般都是使用遞迴方法實現。對於初級程式員來說,雖然遞迴這個過程理解起來有些難度,但只要過程能夠梳理清楚,一般情況下歸併排序還是很容易理解的。
歸併排序是一種O(nlogn)級別的歸併排序,效率比不上快速排序,但對於一般用於對總體無序,但是各子項相對有序的序列,還是有一定用途的。
自頂向下
對於自頂向下的歸併排序,主要過程是先將一個待排序的序列進行等半劃分,然後再使用遞迴策略,對剛剛劃分出的待排序的子序列進行等半劃分,直到劃分到底(每個子序列只有一個元素),這就是 分的過程 。詳細圖示如下:

歸併排序-自頂向下-分
然後,在從底部開始,向上對兩個子序列進行歸併,得到一個有序的子序列,直到歸併到頂,這就是 治的過程 。詳細圖示如下:

歸併排序-自頂向下-治
在 治的過程 中,每兩個待歸併的陣列,需要將每個元素進行比較,合併成一個有序的陣列,這個歸併過程如下圖所示:

歸併排序-歸併過程
在歸併的過程中,有一個重要的操作需要你注意,就是要重新申請一段空間,用於存放已經排好序的陣列。這樣就導致歸併排序的空間複雜度不是太好。但現在計算機的記憶體空間可以說是非常廉價,所以當前這已經不算是一個太大的劣勢。
自底向上
對於自底向上的歸併排序,基本思路和自頂向下是沒有什麼區別的,最大的區別就是:分和治是同步進行的,每分一步,就把分出來的序列治理好。而且分的過程就是從最小的單元開始分,直到分治出整個待排序的序列。整個排序的示意圖如下:

歸併排序--自底向上
總結
以上就是兩種歸併排序的詳細過程,還有一個重點需要說明的情況就是:歸併排序是一種穩定排序,不管待排序序列是幾乎有序的陣列,還是有很多重複的元素,對歸併排序的時間複雜度幾乎都沒有什麼影響。而之前我們講的快速排序,則完全是另一種情況,感興趣的讀者可以看看我之前寫的文章。
我是徐建航, 這是我寫的第54篇文章,歡迎你加入007社群,七天寫一篇,一起寫七年,七年之後一起去南極。
