【排序算法】歸併排序白話講解

概念

  歸併排序是建立在歸併操作上的一種有效的排序算法。

   該算法是採用分治法的一個非常典型的應用。

   將已有序的子序列合併,得到完全有序的序列;

  即先使每個子序列有序,再使子序列段間有序。

  若將兩個有序表合併成一個有序表,稱爲2-路歸併。

使用前提

  有序子列的歸併

  • 假設有上個表A 、B、C,將有序表A、B插入到C中

  • 設置三個指針(並非必須爲指針,可以是任何可以指定位置的結構)Aptr、Bptr、Cptr分別指向A、B、C表的起始位置

  • 比較Aptr和Bptr將大的將其放置到Cptr的位置,然後將改變的+1

  • 代碼
    在這裏插入圖片描述

  • A爲待排序數組(A、B),TmpA爲排序結果臨時存放數組(C),L爲左邊起始位置(Aptr),R右邊的起始位置(Bptr),REnd(右邊數組的長度,左邊的可以計算)

算法思路

在這裏插入圖片描述
  歸併排序是將兩個或兩個以上的有序表合併成一個新的有序表

  將已有序的子序列合併,得到完全有序的序列;

即先使每個子序列有序,再使子序列段間有序。

適用場景

  歸併排序在數據量比較大的時候也有較爲出色的表現(效率上),但是,其空間複雜度O(n)使得在數據量特別大的時候(例如,1千萬數據)幾乎不可接受。

  而且,考慮到有的機器內存本身就比較小,因此,採用歸併排序一定要注意。

算法描述

遞歸法(Top-down)

分而治之

  分而治之是一種使用遞歸解決問題的算法,主要的技巧是將一個大的複雜的問題劃分爲多個子問題,而這些子問題可以作爲終止條件,或者在一個遞歸步驟中得到解決,所有子問題的解決結合起來就構成了對原問題的解決

原理如下(假設序列共有n個元素):

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

   設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置

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

  重複步驟3直到某一指針到達序列尾

  將另一序列剩下的所有元素直接複製到合併序列尾

僞碼描述

  生成臨時存放空間,並向遞歸算法傳入長度
在這裏插入圖片描述
  遞歸算法:每次分半歸併到臨時數組,然後將臨時數組寫回待排數組
在這裏插入圖片描述

迭代法(Bottom-up)

迭代

  將待排序列A進行不斷的歸併,歸併結果存放在A與臨時數組TmpA中(如果每次迭代都開闢臨時數組將會造成巨大的空間佔用),最後將排好序的結果返回在A中即可

原理如下(假設序列共有n個元素):
在這裏插入圖片描述
**  將序列每相鄰兩個數字進行歸併操作,形成ceil(n/2)個序列,排序後每個序列包含兩/一個元素
在這裏插入圖片描述
**  若此時序列數不是1個則將上述序列再次歸併,形成ceil(n/4)個序列,每個序列包含四/三個元素
在這裏插入圖片描述
**  重複步驟2,直到所有元素排序完畢,即序列數爲1
在這裏插入圖片描述
僞碼描述

總控算法:控制迭代算法的執行
在這裏插入圖片描述
迭代算法
在這裏插入圖片描述

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