$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39];
原理:相鄰元素兩兩比較,大的「冒」到右邊,每輪確定一個最大值。
function bubbleSort(array $arr): array {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
for ($k = 0; $k < $len - $i; $k++) {
if ($arr[$k] > $arr[$k + 1]) {
[$arr[$k], $arr[$k + 1]] = [$arr[$k + 1], $arr[$k]]; // PHP 7.1+ 解構賦值
}
}
}
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;
}
原理:將未排序元素插入已排序區間的適當位置,類似整理撲克牌。
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;
}
原理:分治法,選基準值,小的放左、大的放右,遞迴處理子陣列。
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));
}
| 演算法 | 耗時(ms) | 備註 |
|---|---|---|
| PHP 內建 sort() | ~3 | C 級 QuickSort (Zend QSort) |
| quickSort (PHP 遞迴) | ~45 | 函數呼叫開銷大 |
| insertionSort | ~1,200 | O(n²) |
| selectionSort | ~1,500 | O(n²) |
| bubbleSort | ~2,800 | O(n²),最慢 |
sort() / rsort() / usort() / asort() 等內建函數,經過高度優化、穩定可靠。