选择排序每次从未排序部分选最小值放至已排序末尾;将数组分为已排序区和未排序区,第i轮在索引i~n-1找最小值与索引i交换,共进行n-1轮。

PHP中实现选择排序算法,核心是每次从未排序部分找出最小(或最大)元素,放到已排序部分的末尾。逻辑清晰、代码简洁,适合初学者理解排序原理。
选择排序的基本思路
选择排序把数组分为“已排序区”和“未排序区”。每轮从未排序区中选出最小值,与未排序区的第一个位置交换,相当于把最小值“选择”出来并固定到正确位置。
- 第0轮:在索引0~n-1中找最小值,与索引0交换
- 第1轮:在索引1~n-1中找最小值,与索引1交换
- ……依此类推,直到倒数第二个元素
PHP代码实现(升序)
以下是一个标准、易读的选择排序函数:
function selectionSort($arr) {
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
$minIndex = $i; // 假设当前位置是最小值索引
// 在未排序部分(i 到 n-1)中找最小值的索引
for ($j = $i + 1; $j < $n; $j++) {
if ($arr[$j] < $arr[$minIndex]) {
$minIndex = $j;
}
}
// 将找到的最小值与位置 i 交换
if ($minIndex != $i) {
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
}
return $arr;
}
<p>// 使用示例
$nums = [64, 34, 25, 12, 22, 11, 90];
print_r(selectionSort($nums));
// 输出:Array ( [0] => 11 [1] => 12 [2] => 22 [3] => 25 [4] => 34 [5] => 64 [6] => 90 )</p>关键细节说明
写对选择排序要注意几个容易出错的地方:
立即学习“PHP免费学习笔记(深入)”;
-
外层循环只需到
$n - 2(即$i ),因为最后一个元素自动有序 -
内层比较范围从
$i + 1开始,避免重复比自己,也跳过已确定位置的元素 -
交换前判断
$minIndex != $i,避免自交换,提升一点效率 - 该实现返回新数组,不修改原数组;如需原地排序,可传引用(
&$arr)并省略 return
时间与空间复杂度
选择排序性能稳定但不算高效:
- 时间复杂度恒为 O(n²),无论最好、最坏、平均情况,都要做约 n²/2 次比较
- 交换次数最多 n−1 次,属于原地排序(空间复杂度 O(1))
- 不是稳定排序(相同元素的相对位置可能改变)



















