选择排序每次从未排序部分选最小值放至已排序末尾;将数组分为已排序区和未排序区,第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 // 使用示例
$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 )关键细节说明
写对选择排序要注意几个容易出错的地方:
-
外层循环只需到
$n - 2(即$i ),因为最后一个元素自动有序 -
内层比较范围从
$i + 1开始,避免重复比自己,也跳过已确定位置的元素 -
交换前判断
$minIndex != $i,避免自交换,提升一点效率 - 该实现返回新数组,不修改原数组;如需原地排序,可传引用(
&$arr)并省略 return
时间与空间复杂度
选择排序性能稳定但不算高效:
- 时间复杂度恒为 O(n²),无论最好、最坏、平均情况,都要做约 n²/2 次比较
- 交换次数最多 n−1 次,属于原地排序(空间复杂度 O(1))
- 不是稳定排序(相同元素的相对位置可能改变)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











