算法2: 快速排序

快速排序思路: 將第一個數字作爲基準數字,從最右端開始查找(要從右邊開始查起哦,因爲基準數是最左位的).找出小於它的數字,然後再從左端對比.找大於它的數字.然後將倆個數字進行互換.

就這樣一直互換.直到最左與最右走到同一個位置上時,再將這個位置的數字與基準數做對比和互換.這樣就形成了基準數的左邊全是小於的,右邊都是大於的.

然後再將左邊的數據,按照上面的流程進行互換.然後右邊的數據, 最後再進行組合

$arr = array(6, 1 ,2 , 7, 9, 3, 4, 5,10 ,8);
//$arr = array(6,43,45,33,60,50,40);


function quickSort($arr) {
    if(count($arr) <= 1){
        return $arr;
    }
    //拿第一個數字做中間值
    $centre = $arr[0];

    $l = 1;
    $r = count($arr)-1;
    
    while($l < $r && $l != $r ) {
        #從右邊向左邊移動,對比.如果遇到比中間值小的就跳出
        while($arr[$r] > $centre && $l < $r) {
            $r--;
        }
        #從左邊向右邊移動,對比.如果遇到比中間值大的就跳出
        while($arr[$l] < $centre && $l < $r) {
            $l++;
        }
        #如果左邊遇到了比中間值大的數字 並且 右邊遇到了比中間值小的數  則進行互換
        if($l < $r ) {
            $t = $arr[$l];
            $arr[$l] = $arr[$r];
            $arr[$r] = $t;
        }
    }
    #將左右倆邊最終走到一起的值與中間值做對比,並互換位置
    if($arr[$l] < $centre) {
        $tmp1 = $arr[$l];
        $arr[$l] = $centre;
        $arr[0] = $tmp1;
    } else{
        $l--;
    }

    $left_arr = quickSort(array_slice($arr, 0 , $l));
    $right_arr = quickSort(array_slice($arr, $l+1));

    return array_merge($left_arr, array($arr[$l]),  $right_arr);
}

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