首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 陣列冒泡排序算法詳解與優化

     編輯:PHP 綜合知識

冒泡排序是最基礎的排序算法之一,雖然效率不高(O(n²)),但理解其原理對掌握排序思想至關重要。本文通過實例講解 PHP 實現冒泡排序的過程,並提供優化版本。

基本實現

<?php
$array = array(5, 45, 22, 11, 32, 28, 35, 56, 17, 21, 92);
$len = count($array);

for ($i = 0; $i < $len - 1; $i++) {
    for ($j = 0; $j < $len - 1; $j++) {
        $k = $j + 1;
        if ($array[$j] > $array[$k]) {
            // 交換元素
            $t = $array[$j];
            $array[$j] = $array[$k];
            $array[$k] = $t;
        }
    }
}

print_r($array);
// 輸出: Array ( [0] => 5 [1] => 11 [2] => 17 [3] => 21 [4] => 22 [5] => 28 [6] => 32 [7] => 35 [8] => 45 [9] => 56 [10] => 92 )
?>

算法原理解析

  • 外層循環控制比較輪數(共 n-1 輪)
  • 內層循環進行相鄰元素比較並交換
  • 每輪結束後,最大的元素會「冒泡」到末尾
  • 關鍵點:大數後移,依次確定最大值、次大值…

優化版本:提前終止

若某輪未發生交換,說明已有序,可提前結束:

<?php
function bubbleSortOptimized($arr) {
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        $swapped = false;
        // 每輪少比較一個已排好序的元素
        for ($j = 0; $j < $len - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                [$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]]; // PHP 7.1+ 解構賦值
                $swapped = true;
            }
        }
        if (!$swapped) break; // 本輪無交換,已有序
    }
    return $arr;
}

$data = [64, 34, 25, 12, 22, 11, 90];
print_r(bubbleSortOptimized($data));
?>

雙向冒泡排序(雞尾酒排序)

結合正向和反向遍歷,進一步減少比較次數:

<?php
function cocktailSort($arr) {
    $left = 0;
    $right = count($arr) - 1;
    while ($left < $right) {
        // 正向:大數右移
        for ($i = $left; $i < $right; $i++) {
            if ($arr[$i] > $arr[$i + 1]) {
                [$arr[$i], $arr[$i + 1]] = [$arr[$i + 1], $arr[$i]];
            }
        }
        $right--;
        
        // 反向:小數左移
        for ($i = $right; $i > $left; $i--) {
            if ($arr[$i] < $arr[$i - 1]) {
                [$arr[$i], $arr[$i - 1]] = [$arr[$i - 1], $arr[$i]];
            }
        }
        $left++;
    }
    return $arr;
}
?>

性能對比與建議

算法平均時間複雜度最好情況穩定性適用場景
基本冒泡O(n²)O(n²)穩定教學演示
優化冒泡O(n²)O(n)穩定小數據量、近乎有序
雞尾酒排序O(n²)O(n)穩定小數據量、雙向有序
PHP sort()O(n log n)O(n log n)不穩定生產環境首選

實際開發建議: 生產環境請直接使用 PHP 內置 sort()、asort() 等函數,底層採用快速排序變體,性能遠超冒泡排序。

相關專題推薦

更多排序算法內容,請參考:《PHP 排序算法總結》、《PHP 數據結構與算法教程》、《PHP 程序設計算法總結》等專題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved