每轮从未排序区选出极值(最大/最小),与区首元素交换。共 n-1 趟。
示例 [2,6,3,9] 降序:
[9,2,3,6][9,6,2,3][9,6,3,2]<?php
function selectSort(array &$arr): array {
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
$maxIdx = $i;
for ($j = $i + 1; $j < $n; $j++) {
if ($arr[$j] > $arr[$maxIdx]) {
$maxIdx = $j;
}
}
if ($maxIdx !== $i) {
[$arr[$i], $arr[$maxIdx]] = [$arr[$maxIdx], $arr[$i]]; // PHP 7.1+ 解构赋值
}
}
return $arr;
}
$arr = [2, 6, 3, 9];
selectSort($arr);
print_r($arr); // [9, 6, 3, 2]
?>
| 维度 | 复杂度 |
|---|---|
| 时间 | O(n²) —— 双重循环,比较次数 n(n-1)/2 |
| 空间 | O(1) —— 原地排序 |
| 稳定性 | 不稳定(交换可能改变相等元素相对序) |
rsort()