function bubbleSort(array &$arr) {
$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; // 已有序提前退出
}
}
時間複雜度:O(n²) 最好 O(n);空間 O(1);穩定。
function selectionSort(array &$arr) {
$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]];
}
}
時間複雜度:O(n²);空間 O(1);不穩定;交換次數最少 (n-1)。
function insertionSort(array &$arr) {
$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;
}
}
時間複雜度:O(n²) 最好 O(n);空間 O(1);穩定;小數據量/近乎有序時極快。
function quickSort(array &$arr, $left = 0, $right = null) {
if ($right === null) $right = count($arr) - 1;
if ($left >= $right) return;
$pivot = $arr[(int)(($left + $right) / 2)];
$i = $left; $j = $right;
while ($i <= $j) {
while ($arr[$i] < $pivot) $i++;
while ($arr[$j] > $pivot) $j--;
if ($i <= $j) {
[$arr[$i], $arr[$j]] = [$arr[$j], $arr[$i]];
$i++; $j--;
}
}
if ($left < $j) quickSort($arr, $left, $j);
if ($i < $right) quickSort($arr, $i, $right);
}
平均 O(n log n),最壞 O(n²);空間 O(log n) 棧;不穩定;實際性能通常最優。
function quickSortFunc(array $arr, $order = 'asc') {
if (count($arr) <= 1) return $arr;
$pivot = $arr[0];
$left = $right = [];
foreach (array_slice($arr, 1) as $v) {
if (($order === 'asc' && $v <= $pivot) || ($order === 'desc' && $v >= $pivot)) {
$left[] = $v;
} else {
$right[] = $v;
}
}
return array_merge(quickSortFunc($left, $order), [$pivot], quickSortFunc($right, $order));
}
function linearSearch(array $arr, $target) {
foreach ($arr as $i => $v) {
if ($v === $target) return $i;
}
return -1;
}
function binarySearch(array $arr, $target) {
$left = 0; $right = count($arr) - 1;
while ($left <= $right) {
$mid = (int)(($left + $right) / 2);
if ($arr[$mid] === $target) return $mid;
if ($arr[$mid] < $target) $left = $mid + 1;
else $right = $mid - 1;
}
return -1;
}
時間 O(log n);空間 O(1);要求數組已排序。
| 算法 | 耗時 | 備註 |
|---|---|---|
| PHP 內置 sort() | 0.012s | C 級實現,生產首選 |
| 快速排序 (原地) | 0.045s | 次之 |
| 插入排序 | 1.8s | 僅適合小數組 |
| 選擇排序 | 2.1s | 教學用 |
| 冒泡排序 | 3.5s | 教學用 |
sort()/rsort()/usort():C 實現、高度優化、支持自定義比較器。array_search 內部為線性,in_array 同理。ORDER BY、Redis 有序集合 (ZSET)。