排序算法是計算機科學基石。本文提供三種經典排序的 PHP 實現,附帶時間複雜度分析、優化技巧與基準測試建議。
function bubbleSort(array $arr): array {
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
$swapped = false;
// 內層每輪減少一個已排定的最大值
for ($j = 0; $j < $len - $i - 1; $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;
}
function shellSort(array $arr): array {
$len = count($arr);
// 增量序列:Knuth 序列 (3^k - 1)/2 或簡單折半
for ($gap = $len >> 1; $gap > 0; $gap >>= 1) {
// 對每個分組進行插入排序
for ($i = $gap; $i < $len; $i++) {
$temp = $arr[$i];
$j = $i;
while ($j >= $gap && $arr[$j - $gap] > $temp) {
$arr[$j] = $arr[$j - $gap];
$j -= $gap;
}
$arr[$j] = $temp;
}
}
return $arr;
}
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;
}
$data = range(1, 10000);
shuffle($data);
$algos = ['bubbleSort', 'shellSort', 'selectionSort', 'sort']; // 內置 sort() 為 QuickSort 混合
foreach ($algos as $algo) {
$copy = $data;
$start = microtime(true);
$algo($copy);
$time = microtime(true) - $start;
echo "$algo: ${time}s\n";
}
/* 典型輸出(機器相關):
bubbleSort: 2.45s
selectionSort: 1.82s
shellSort: 0.012s
sort: 0.001s
*/
| 算法 | 適用場景 | PHP 實際開發建議 |
|---|---|---|
| 冒泡/選擇 | 教學、極小數據集 (<50) | **生產禁用** |
| 希爾 | 中等數據、嵌入式受限環境 | 可作為內置函數不可用時的備選 |
內置 sort()/usort() | **所有生產場景** | C 級實現的混合快排/歸併排,性能極致,支持自定義比較器 |