冒泡排序是最基礎的排序算法之一,雖然效率不高(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 程序設計算法總結》等專題。