php實現歸併排序

php實現歸併排序:

這個排序我看了很久,大多數代碼是從百度上看到的,因爲我也是一個php的菜菜的,不過覺得應該把思路寫下來,一方面是自己要總結一下,一方面是自己把思路寫出來如果有哪裏不對的地方也希望有人能幫我指正一下。

我感覺歸併排序的歸就在於遞歸,並就在於合併。

歸併排序是分治法的一個重要的體現,所以我們需要用分治法的思想去考慮歸併排序。它拿到一個數組了以後,這個數組就好像一個棍子,先將這個棍子掰成兩半,然後我們再把分成一半的棍子再一分爲二,那麼它就這樣被分下去,直到數組的長度等於1的時候就停下來,這就是歸的那一步分。就是在將數組分成n分之一的時候,如何將它排好序再合併爲一個數組。

在合併的時候它使用了一個輔助數組,就是先將已經不能再分的兩塊數組的第一個進行比較,將較小的先放入輔助數組中,然後再這樣比較,直到兩個數組中一個爲空,然後只需要將另外一個數組全部都複製到輔助數組中後面的位置,一次合併就這樣完成了,然後函數返回合併以後的數組。

遇到的問題:在合併數組的時候還是沒有想清楚到底merge函數和merge_sort函數的功能到底是什麼,merge_sort的功能其實就是將一個數組無線分割下去,分割到這個數組不能再分爲止。然後merge函數的功能其實就是講兩個已經分割的數組再進行有序的合併,並將結果返回給merge_sort函數,然後merge_sort中的數組是引用的,所以就直接對數組進行了改變。

$arr=array(1,2,3,5,2,3,9,8,3,2,7,4,9,8,0,4,587,93,47,59,8,2,6,83,4,9,65,2,18,7);
printArr($arr);
echo "<hr>";
function merge_sort(&$arr){
    $len=count($arr);
    if($len==1)
        return $arr;
    $middle=intval($len/2);
    $left=array_slice($arr,0,$middle);
    $right=array_slice($arr,$middle);
    merge_sort($left);
    merge_sort($right);
    $arr=merge($left,$right);
}
function merge($leftarr,$rightarr){
    $arrmerge=array();
    while(count($leftarr) && count($rightarr))
        $arrmerge[]=$leftarr[0]<$rightarr[0]?array_shift($leftarr):array_shift($rightarr);
    return array_merge($arrmerge,$leftarr,$rightarr);
}
merge_sort($arr);
printArr($arr);
function printArr($arr){
    for($i=0;$i<count($arr);$i++)
        echo ' '.$arr[$i];
}

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