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,12,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,12,44,53,10,3,56]; //測試數組,鍵值可重複
$res=bubbleSort($arrtest);
var_dump($res);