排序是資料處理高頻需求,PHP 提供 sort() 等內建函式 (C 底層實作、效能極佳),理解其行為與旗標至關重要;同時手寫經典演算法 (冒泡、快速) 能強化邏輯思維與面試準備。
<?php
$arr = [75, 32, 65, 98, 85, 12];
sort($arr); // 就地排序,重建 0-based 索引
foreach ($arr as $k => $v) { echo $v . ' '; }
// 輸出:12 32 65 75 85 98
?>
| 旗標 | 行為 | 適用場景 |
|---|---|---|
SORT_REGULAR | 一般比較 (型別轉換後比較) | 預設,混合型別陣列 |
SORT_NUMERIC | 數值比較 | 純數字陣列,避免字串比較 '10' < '2' |
SORT_STRING | 字串比較 | 純字串陣列 |
SORT_LOCALE_STRING | 依當地語系比較 | 多語系排序需 setlocale() |
SORT_NATURAL | 自然排序 (人類直覺) | ['img1','img2','img10'] 正確排序 |
SORT_FLAG_CASE | 不分大小寫 (搭配 STRING/NATURAL) | 案例不敏感排序 |
| 函式 | 排序依據 | 索引處理 | 關聯性保留 |
|---|---|---|---|
sort | 值 | 重建 0-based | 否 |
rsort | 值 (降序) | 重建 0-based | 否 |
asort | 值 | 保留鍵名 | 是 |
arsort | 值 (降序) | 保留鍵名 | 是 |
ksort | 鍵 | 保留鍵名 | 是 |
krsort | 鍵 (降序) | 保留鍵名 | 是 |
usort | 自訂比較函式 | 重建 0-based | 否 |
uasort | 自訂比較函式 | 保留鍵名 | 是 |
uksort | 鍵自訂比較 | 保留鍵名 | 是 |
natsort | 自然排序 | 保留鍵名 | 是 |
natcasesort | 自然排序不分大小寫 | 保留鍵名 | 是 |
array_multisort | 多陣列/多維排序 | 視情況 | 視情況 |
<?php
$arr = [75, 32, 65, 98, 85, 12];
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) { // 趟數:n-1 趟
for ($j = 0; $j < $n - 1 - $i; $j++) { // 每趟比較次數遞減
if ($arr[$j] > $arr[$j + 1]) { // 相鄰比較,大者後移
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
foreach ($arr as $k => $v) { echo $v . ' '; }
// 輸出:12 32 65 75 85 98
?>

| 指標 | 冒泡排序 | PHP sort() (QuickSort/混合) |
|---|---|---|
| 時間複雜度 (平均) | O(n²) | O(n log n) |
| 時間複雜度 (最佳) | O(n) (已排序 + 優化旗標) | O(n log n) |
| 時間複雜度 (最差) | O(n²) | O(n log n) |
| 空間複雜度 | O(1) 原地 | O(log n) 堆疊 |
| 穩定性 | 穩定 | 不穩定 (QuickSort) |
| 適用資料量 | < 50 (教學/極小資料) | 任意 (生產環境首選) |
<?php
function quickSort(array $arr) : array {
if (count($arr) <= 1) return $arr;
$pivot = $arr[0];
$left = $right = [];
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] < $pivot) $left[] = $arr[$i];
else $right[] = $arr[$i];
}
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
$arr = [75, 32, 65, 98, 85, 12];
print_r(quickSort($arr));
?>
需要排序? ├─ 關聯陣列需保留鍵值對應 → asort / arsort / ksort / uasort ├─ 純數值/字串陣列 → sort / rsort (加 SORT_NUMERIC/SORT_NATURAL) ├─ 多維/多鍵排序 → array_multisort ├─ 複雜自訂邏輯 → usort / uksort (回傳 -1/0/1) └─ 教學/面試/極小資料 → 手寫冒泡/快速/合併排序理解原理
sort() 回傳 bool (成功/失敗),不是排序後陣列:$sorted = sort($arr) 錯誤,正確 sort($arr); $sorted = $arr;。SORT_NUMERIC:['10','2'] → ['10','2'] (字典序),加旗標 → ['2','10']。shuffle() 打亂陣列順序 (洗牌),同樣重建索引。usort + 自訂比較函式或 array_multisort。善用內建 sort() 家族函式解決 99% 生產排序需求,手寫演算法專注於理解原理與應對面試。