冒泡排序通過重複遍歷數組,比較相鄰元素並交換順序,將較大(或較小)元素像氣泡一樣逐步「浮」到數組末端。每輪遍歷確定一個極值位置,需 n-1 輪完成排序。
初始: 49 38 65 97 76 13 27 第1輪: 38 49 65 76 13 27 97 (97 確定) 第2輪: 38 49 65 13 27 76 97 (76 確定) 第3輪: 38 49 13 27 65 76 97 (65 確定) 第4輪: 38 13 27 49 65 76 97 (49 確定) 第5輪: 13 27 38 49 65 76 97 (38 確定) 第6輪: 13 27 38 49 65 76 97 (27 確定,提前結束可優化)
function bubbleSort(array &$arr): void {
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
$swapped = false; // 優化標記:若無交換提前結束
for ($j = 0; $j < $n - 1 - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
[$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]]; // 解構賦值交換
$swapped = true;
}
}
if (!$swapped) break; // 已有序
}
}
// 測試
$data = [345, 4, 17, 6, 52, 16, 58, 69, 32, 8, 234];
bubbleSort($data);
print_r($data); // [4, 6, 8, 16, 17, 32, 52, 58, 69, 234, 345]
| 指標 | 數值 | 說明 |
|---|---|---|
| 時間複雜度(最好) | O(n) | 已有序數組,單輪無交換即結束 |
| 時間複雜度(平均/最壞) | O(n²) | 逆序或隨機數組 |
| 空間複雜度 | O(1) | 原地排序,僅需常數額外空間 |
| 穩定性 | 穩定 | 相等元素相對位置不變 |
sort()/usort()(C 級快速排序/混合排序,O(n log n))。冒泡排序雖簡陋,但其「相鄰比較交換」的思想是理解更高級排序算法的基石。