掌握經典排序演算法是程式設計基礎。本文提供 PHP 實作的四大排序法,含時間複雜度分析與適用場景說明。
時間複雜度:O(n²) | 穩定排序 | 適合小資料量教學
function bubbleSort(array $arr): array {
$len = count($arr);
for ($i = 0; $i < $len; $i++) {
for ($j = $len - 1; $j > $i; $j--) {
if ($arr[$j] < $arr[$j - 1]) {
[$arr[$j], $arr[$j - 1]] = [$arr[$j - 1], $arr[$j]];
}
}
}
return $arr;
}
時間複雜度:O(n²) | 穩定 | 近乎有序資料表現佳(接近 O(n))
function insertionSort(array $arr): array {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$key = $arr[$i];
$j = $i - 1;
while ($j >= 0 && $arr[$j] > $key) {
$arr[$j + 1] = $arr[$j];
$j--;
}
$arr[$j + 1] = $key;
}
return $arr;
}
時間複雜度:O(n²) | 不穩定 | 交換次數最少(O(n))
function selectionSort(array $arr): array {
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
$minIdx = $i;
for ($j = $i + 1; $j < $len; $j++) {
if ($arr[$j] < $arr[$minIdx]) {
$minIdx = $j;
}
}
if ($minIdx !== $i) {
[$arr[$i], $arr[$minIdx]] = [$arr[$minIdx], $arr[$i]];
}
}
return $arr;
}
時間複雜度:平均 O(n log n) | 不穩定 | 實務最常用
function quickSort(array $arr): array {
$len = count($arr);
if ($len <= 1) return $arr;
$pivot = $arr[0];
$left = $right = [];
for ($i = 1; $i < $len; $i++) {
$arr[$i] <= $pivot ? $left[] = $arr[$i] : $right[] = $arr[$i];
}
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
$test = [43, 154, 3, 78, 13, 284, 167, 2, 56, 2234, 121, 57, 345];
var_dump(quickSort($test));
// 輸出: [2, 3, 13, 43, 56, 57, 78, 121, 154, 167, 284, 345, 2234]
| 演算法 | 平均複雜度 | 空間複雜度 | 穩定性 | 建議場景 |
|---|---|---|---|---|
| 冒泡 | O(n²) | O(1) | 穩定 | 教學、極小資料 |
| 插入 | O(n²) | O(1) | 穩定 | 近乎有序、小資料 |
| 選擇 | O(n²) | O(1) | 不穩定 | 記憶體寫入昂貴 |
| 快速 | O(n log n) | O(log n) | 不穩定 | 通用大量資料 |
生產環境直接使用 PHP 內建 sort() / usort()(底層為 QuickSort 改良版),僅在面試、教學或特殊需求時手寫演算法。