排序算法是程式設計的基礎核心,掌握各類排序邏輯不僅能提升代碼效能,更是面試與實戰開發的必備技能。本文將系統整理 PHP 中四大經典排序算法——冒泡排序、快速排序、選擇排序、插入排序的原理、代碼實現與優化方案,並提供一個可複用的排序類庫供實戰參考。
冒泡排序透過相鄰元素兩兩比較,將較大(或較小)的元素逐步「冒泡」至序列末端。雖然時間複雜度為 O(n²),但邏輯直觀,適合教學與小規模數據。
function bubbleSort(array $arr): array {
$len = count($arr);
if ($len <= 1) return $arr;
for ($i = 0; $i < $len; $i++) {
// 優化:若某輪無交換則提前結束
$swapped = false;
for ($j = $len - 1; $j > $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;
}
快速排序採用分治法:選取基準值,將陣列分為「小於基準」與「大於基準」兩部分,再遞歸排序子陣列。平均時間複雜度 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++) {
if ($arr[$i] <= $pivot) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
每輪從未排序區間選出最小值,放至已排序區間末尾。雖然同為 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)。
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;
}
為方便實戰調用,封裝一個支援多種算法、可配置的排序類:
<?php
class Sorter {
private array $data = [];
private string $algorithm = 'insert';
private bool $debug = false;
public function __construct(array $config = []) {
if ($config) $this->init($config);
}
private function init(array $config): bool {
foreach ($config as $key => $val) {
if (property_exists($this, $key)) $this->$key = $val;
}
$method = $this->algorithm . 'Sort';
if (!method_exists($this, $method)) return false;
$this->data = $this->$method($this->data);
return true;
}
public function getResult(): array { return $this->data; }
// 四大排序私有方法(同上標準實現,略)
private function insertSort(array $arr): array { /* ... */ }
private function selectSort(array $arr): array { /* ... */ }
private function bubbleSort(array $arr): array { /* ... */ }
private function quickSort(array $arr): array { /* ... */ }
}
// 使用範例
$sorter = new Sorter([
'data' => [49, 38, 65, 97, 76, 13, 27],
'algorithm' => 'quick',
'debug' => true
]);
print_r($sorter->getResult());
| 算法 | 平均複雜度 | 空間複雜度 | 穩定性 | 適用場景 |
|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(1) | 穩定 | 教學、極小數據 |
| 快速排序 | O(n log n) | O(log n) | 不穩定 | 通用高效排序首選 |
| 選擇排序 | O(n²) | O(1) | 不穩定 | 寫入成本高、小數據 |
| 插入排序 | O(n²) | O(1) | 穩定 | 近乎有序、小數據 |
理解排序算法的底層邏輯,能幫助開發者根據數據特徵選擇最優方案。實際專案中,優先使用 PHP 內建的 sort()、usort() 等高度優化函式;僅在特殊需求(如自定義比較、教學演示)時手寫算法。希望本文能成為你 PHP 排序開發的實用參考。