1. 程式人生 > 其它 >排序演算法學習——歸併排序

排序演算法學習——歸併排序

我們先看歸併排序的定義

歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。

簡單來說就是將兩個有序表合併成一個有序表。

我們先通過下圖來了解一下歸併排序的流程。

下面我們來看如何分解然後再合併的步驟

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟3直到某一指標達到序列尾
將另一序列剩下的所有元素直接複製到合併序列尾
最後我們用PHP實現了歸併排序的演算法

function Merge($arr,$l,$m,$r){
    $t = $arr;
    $start = $l;
    $end = $m+1;
    while($l<=$r){
        if($l>$m||$end>$r) break;
        if($arr[$l]<$arr[$end]){
            $t[$start++] = $arr[$l++];
        }else{
            $t[$start++] = $arr[$end++];
        }
    }
    if
($l<=$m){ $s = $l; $e = $m; }elseif($r>=$end){ $s = $end; $e = $r; } while($s<=$e){ $t[$start++] = $arr[$s++]; } $arr = $t; return $arr; } function MergeSort(&$arr,$l,$r){ if($r <= $l) return ; $m = floor(($l+$r)/2); MergeSort(
$arr,$l,$m); MergeSort($arr,$m+1,$r); $arr = Merge($arr,$l,$m,$r); } $arr = array(10,6,8,23,4,1,17,56,32,50,11,9); MergeSort($arr,0,count($arr)-1); print_r($arr);

上面程式碼是使用遞迴的機制實現的,當然也可以使用非遞迴的形式來實現,大家可以參考《歸併排序(非遞迴實現)》這篇文章。

用PHP實現歸併排序,按照上面的程式碼來說,其程式碼比較繁瑣。PHP有其自己的特色,可以用更少的程式碼來實現歸併排序。但是上述程式碼更能體現整個分解和合並的過程。所以如果是學習歸併排序演算法的話,建議使用上述程式碼,雖說程式碼繁瑣,但是對於理解歸併排序的過程有很大的幫助。

更詳細的歸併排序的演算法我新寫了一篇文章全面瞭解歸併排序演算法,大家可以參考。