算法複雜度速查
| 算法 | 平均時間 | 最壞時間 | 空間 | 穩定性 |
| 冒泡排序 | O(n²) | O(n²) | O(1) | 穩定 |
| 交換排序 | O(n²) | O(n²) | O(1) | 不穩定 |
| 選擇排序 | O(n²) | O(n²) | O(1) | 不穩定 |
| 插入排序 | O(n²) | O(n²) | O(1) | 穩定 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不穩定 |
完整 PHP 實現
<?php
// 冒泡排序:相鄰比較,大元素沉底
function bubbleSort(array $arr): array {
$n = count($arr);
for ($i = 1; $i < $n; $i++) {
for ($j = $n - 1; $j >= $i; $j--) {
if ($arr[$j] < $arr[$j - 1]) {
[$arr[$j - 1], $arr[$j]] = [$arr[$j], $arr[$j - 1]]; // 解構賦值交換
}
}
}
return $arr;
}
// 交換排序:基準元素與後續逐一比較交換
function exchangeSort(array $arr): array {
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
for ($j = $i + 1; $j < $n; $j++) {
if ($arr[$j] < $arr[$i]) {
[$arr[$i], $arr[$j]] = [$arr[$j], $arr[$i]];
}
}
}
return $arr;
}
// 選擇排序:每輪選最小值放到有序區末尾
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 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;
}
// 快速排序:分治法,基準值分區遞歸
function quickSort(array $arr): array {
$n = count($arr);
if ($n <= 1) return $arr;
$pivot = $arr[0];
$left = $right = [];
for ($i = 1; $i < $n; $i++) {
if ($arr[$i] < $pivot) $left[] = $arr[$i];
else $right[] = $arr[$i];
}
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
// 測試
$data = [7, 1, 6, 5, 2];
echo "原始: " . implode(',', $data) . "\n";
echo "冒泡: " . implode(',', bubbleSort($data)) . "\n";
echo "交換: " . implode(',', exchangeSort($data)) . "\n";
echo "選擇: " . implode(',', selectionSort($data)) . "\n";
echo "插入: " . implode(',', insertionSort($data)) . "\n";
echo "快速: " . implode(',', quickSort($data)) . "\n";
?>
輸出結果
原始: 7,1,6,5,2
冒泡: 1,2,5,6,7
交換: 1,2,5,6,7
選擇: 1,2,5,6,7
插入: 1,2,5,6,7
快速: 1,2,5,6,7
實戰選擇指南
- 數據量 < 50、教學演示:插入排序(代碼簡潔、近乎有序時 O(n))
- 通用中小數據、追求簡潔:
sort()/usort() 內建函數(C 實現的 QuickSort/MergeSort 混合)
- 大數據、性能敏感:不建議純 PHP 實現,改用扩展(php-ds、FFI 調用 C++)、或資料庫
ORDER BY
- 外部排序/海量文件:歸併排序 + 臨時文件分塊
內建函數對比
<?php
$arr = [7,1,6,5,2];
sort($arr); // 重建索引,升序
rsort($arr); // 降序
usort($arr, fn($a,$b) => $a <=> $b); // 自定義比較(太空船操作符 PHP 7+)
asort($arr); // 保持鍵值關聯升序
ksort($arr); // 按鍵名排序
?>