php實現 歸併排序,快速排序

jiangjun發表於2021-04-15

歸併排序

歸併排序採用分治,遞迴思想。先將資料從中間分開,分成兩個部分。然後前後兩部分分別排序(繼續分,直至最後只有一個數),再合併,排序完成。

$array = [5,4,6,9,1,4,4,9];
function sortd($array){
    if (count($array)>1) {
        $num = count($array);
        $middle = floor($num/2);
        $arrLeft= array_slice($array, 0, $middle);
        $arrRight= array_slice($array, $middle);
        return merge(sortd($arrLeft), sortd($arrRight));
    } else {
        return $array;
    }
}

function merge($array1, $array2) {
    $newArray = [];
    $index1 = 0;
    $index2 = 0;
    $num1 = count($array1);
    $num2 = count($array2);
    while ($index1<$num1 && $index2<$num2) {
        $newArray[] = $array1[$index1]>$array2[$index2]?$array1[$index1++]:$array2[$index2++];
    }
    for ($index1; $index1<$num1; $index1++) {
        $newArray[] = $array1[$index1];
    }
    for ($index2; $index2<$num2; $index2++) {
        $newArray[] = $array2[$index2];
    }
    return $newArray;
}

快速排序

快速排序也是採用分治和遞迴思想;將資料找出一個數,將比小的放在一邊,比他大的放在另一邊這個數放中間。然後這兩個區域重複上一步操作,直到兩邊的數剩下一個數,排序完成。

function quickSort($arr){
    $num = count($arr);
    if ($num <= 1) {
        return $arr;
    }
    $middle = $arr[0];
    $leftArray = array();
    $rightArray = array();

    for ($i = 1; $i < $num; $i++) {
        if ($arr[$i] < $middle) {
            $rightArray[] = $arr[$i];
        } else {
            $leftArray[] = $arr[$i];
        };
    }
    $leftArray = quickSort($leftArray);
    $leftArray[] = $middle;

    $rightArray = quickSort($rightArray);
    return array_merge($leftArray, $rightArray);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章