簡單選擇排序的核心思想:每輪從未排序區間選出最小(或最大)元素,與該區間首位元素交換。具體步驟:
$i(0 到 n-1)$i 位置即最小值,記錄索引 $min = $i$i+1 到末尾,發現更小值則更新 $min$min !== $i 則交換兩者位置時間複雜度:O(n²),空間複雜度:O(1),屬於不穩定排序。
<?php
/**
* 簡單選擇排序
* @param array $list 待排序數組(引用傳遞修改原數組)
* @return array 排序後數組
*/
function sort_simple_selection(array &$list): array {
$len = count($list);
if ($len <= 1) return $list;
for ($i = 0; $i < $len; $i++) {
$min = $i;
for ($j = $i + 1; $j < $len; $j++) {
// 升序:< ;降序:>
if ($list[$j] < $list[$min]) {
$min = $j;
}
}
// 可選:輸出每輪過程用於教學演示
// echo implode(',', $list) . "#pos=" . ($min + 1) . " min=" . $list[$min] . "<br/>";
if ($min != $i) {
[$list[$i], $list[$min]] = [$list[$min], $list[$i]]; // PHP 7.1+ 解構賦值交換
}
// echo "-------------------------<br/>";
}
return $list;
}
// 測試
$list = [4, 3, 2, 1, 5, 7, 3, 7];
sort_simple_selection($list);
var_dump($list); // [1, 2, 3, 3, 4, 5, 7, 7]
array &$list 避免大數組拷貝[$a, $b] = [$b, $a] 替代臨時變量交換array 增強可讀性若保留註釋中的輸出代碼,執行過程將顯示每輪掃描狀態:
4,3,2,1,5,7,3,7#pos=4 min=1 ------------------------- 1,3,2,4,5,7,3,7#pos=3 min=2 ------------------------- 1,2,3,4,5,7,3,7#pos=7 min=3 ------------------------- ...
這對理解算法流程極有幫助,生產環境請移除。
| 優勢 | 劣勢 | 適用場景 |
|---|---|---|
| 實現簡單、無額外空間 | O(n²) 效率低 | 教學演示、極小數據集(<50)、內存極受限環境 |
| 交換次數最少(最多 n-1 次) | 不穩定排序 | 寫入成本極高的存儲介質(如 EEPROM) |
實際項目中請直接使用 PHP 內建 sort() / rsort()(基於快速排序變體),性能優於手寫 O(n²) 算法數個數量級:
sort($list, SORT_NUMERIC); // 升序
rsort($list, SORT_NUMERIC); // 降序