原理
在序列中找到最小的元素,放到序列的起始位置,再从剩余未排序区间中寻找最小元素,放到第二个位置,以此类推,直到所有元素排序完毕。
代码
function select_sort($arr){
if(!is_array($arr)) {
return -1;
}
$len = count($arr);
//先判断数组是否需要排序
if($len < 2){
return $arr;
}
//从第一个元素开始依次与后面的最小值交换位置
for($i = 0; $i < $len-1; $i++){
//记录最小值坐标
$minIndex = $i;
//找出无序区间最小值的坐标
for($j = $i+1; $j < $len; $j++){
//在无序区间找出最小值并记录坐标
if($arr[$j] < $arr[$minIndex]){
$minIndex = $j;
}
}
//将无序区间的最小值交换只无序区间的第一个位置
if($minIndex != $i){
$temp = $arr[$minIndex];
$arr[$minIndex] = $arr[$i];
$arr[$i] = $temp;
}
}
return $arr;
}
$arr = [1,3,2,4,6,5];
$res = select_sort($arr);
print_r($res);
时间复杂度
O(n^2)
空间复杂度
O(1)
稳定性
不稳定,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。
适用场景
适用于数据量小或部分元素已完成排序的情况。