php實現快速排序和冒泡排序


快速排序

實現思路:把第一個元素作為標記,依次判斷后續的值,如果小於它則放在左邊,如果大於它則放右邊,同理把左右兩部分看成一個整體一直遞歸,最后再數組拼接起來

它的最優時間復雜度為O(nlogn)【以標記元素為中心,正好每次左右都能均勻分配】,最糟糕時間復雜度為O(n^2)【標記元素每次是最大或最小值,使所有數都划分到一邊】

function quickSort($arr)
{
    $count = count($arr);   //統計出數組的長度
    if ($count <= 1) { // 如果個數為空或者1,則原樣返回數組
        return $arr;
    }
    $index = $arr[0]; // 把第一個元素作為標記
    $left = [];    //定義一個左空數組 
    $right = [];    //定義一個有空數組
    for ($i = 1; $i < $count; $i++) {   //從數組的第二數開始與第一個標記元素作比較
        if ($arr[$i] < $index) {        //如果小於第一個標記元素則放進left數組
            $left[] = $arr[$i];
        } else {                        //如果大於第一個標記元素則放進right數組
            $right[] = $arr[$i];
        }
    }
    $left  = quickSort($left);      //把left數組再看成一個新參數,再遞歸調用,執行以上的排序
    $right = quickSort($right);     //把right數組再看成一個新參數,再遞歸調用,執行以上的排序
    return array_merge($left, [$arr[0]], $right);   //最后把每一次的左數組、標記元素、右數組拼接成一個新數組
}

$arrtest=[12,43,54,33,23,14,44,53,10,3,56]; //測試數組
$res=quickSort($arrtest);      
var_dump($res); 

冒泡排序

實現思路:每次從數組里面選出一個最大值,一直遞歸

它的最優時間復雜度為O(n)【正序,數組排好情況下】,最糟糕時間復雜度為O(n^2)【反序:數組排序剛好相反】

function bubbleSort($arr)
{
    $count = count($arr);       //統計出數組的長度
    for ($i = 1; $i < $count; $i++) {       //控制需要排序的輪數,該例子共需要比較10輪
        for ($j = 0; $j < $count - $i; $j++) {  //控制每一輪需要比較的次數,每輪選出最大的一個值放在最后
            if ($arr[$j] > $arr[$j+1]) {        
                $temp = $arr[$j];           //通過$temp介質把大的值放在后面
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;       //返回最終結果
}


$arrtest=[12,43,54,33,23,14,44,53,10,3,56]; //測試數組
$res=bubbleSort($arrtest);      
var_dump($res);     

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM