雖然 PHP 內建 `sort()`、`usort()` 高效且好用,但理解經典排序演算法有助於面試、教學與特殊場景優化。本文提供四大經典排序的 PHP 實作、時間複雜度分析與適用情境。
適合小規模或近乎有序資料,穩定排序。
function insertionSort(array $arr): array {
$n = count($arr);
for ($i = 1; $i < $n; $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))。
function selectionSort(array $arr): array {
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
$minIdx = $i;
for ($j = $i + 1; $j < $n; $j++) {
if ($arr[$j] < $arr[$minIdx]) $minIdx = $j;
}
if ($minIdx !== $i) {
[$arr[$i], $arr[$minIdx]] = [$arr[$minIdx], $arr[$i]];
}
}
return $arr;
}
相鄰比較交換,大值像氣泡浮到右側。教學用途為主。
function bubbleSort(array $arr): array {
$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; // 提前結束優化
}
return $arr;
}
分治法,選基準值分區遞迴,平均效能最佳。
function quickSort(array $arr): array {
if (count($arr) <= 1) return $arr;
$pivot = $arr[0];
$left = $right = [];
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] <= $pivot) $left[] = $arr[$i];
else $right[] = $arr[$i];
}
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
// 原地分區版本 (空間 O(log n))
function quickSortInPlace(array &$arr, int $low, int $high): void {
if ($low < $high) {
$pi = partition($arr, $low, $high);
quickSortInPlace($arr, $low, $pi - 1);
quickSortInPlace($arr, $pi + 1, $high);
}
}
function partition(array &$arr, int $low, int $high): int {
$pivot = $arr[$high];
$i = $low - 1;
for ($j = $low; $j <= $high - 1; $j++) {
if ($arr[$j] <= $pivot) {
$i++;
[$arr[$i], $arr[$j]] = [$arr[$j], $arr[$i]];
}
}
[$arr[$i + 1], $arr[$high]] = [$arr[$high], $arr[$i + 1]];
return $i + 1;
}
| 演算法 | 執行時間 | 備註 |
|---|---|---|
| PHP 內建 sort() | ~0.002秒 | C 實作 QuickSort + 優化 |
| 快速排序 (PHP) | ~0.15秒 | 遞迴呼叫開銷大 |
| 插入排序 | ~1.8秒 | O(n²) 明顯 |
| 選擇排序 | ~2.1秒 | 固定 O(n²) |
| 氣泡排序 | ~3.5秒 | 最慢 |