介绍
选择排序 主要是先假设数列中的第一个元素是最小,然后循环和数列中除本身外的每一位进行比较,如果碰到比它小的,就交换位置后继续比较。
实例
$arr = [18,11,1,15,2,35,55,12,17,65,23,48,56,22,5];
// 控制循环对比的轮数
for($i = 0; $i < count($arr); $i++){
// 实际对每一位进行循环对比
for($j = $i+1; $j<count($arr); $j++){
// 每次从数组中去一位 和该元素后面身下的元素进行对比
if($arr[$i] > $arr[$j]){
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
代码分析
第一轮循环,取外层循环的 $i = 0
,假设 $arr
数组的第一位元素是最小的,然后在第二层循环中和它后面的每一位进行对比。
第一次对比流程开始,此时 $i = 0
,$arr[$i] = 18
,第二层循环用 $arr[$i] = 18
和它后面的第二位元素$arr[$j]
也就是 $arr[$i +1]
进行对比,然后发现 18
大于 11
,这时候,它俩进行交换,交换完成后,$arr[$i]
的值变成了 11
,而 $arr[$j]
的值变成了 18
,然后继续开始后面的循环。
这时第二层循环进入第二轮,$j
的值变成了 2
,然后 11
继续和 1
对比,发现 11
大于 1
,它俩进行交换,交换完成后,$arr[$i]
的值变成了 1
而此时 $arr[$j]
也就是 $arr[1]
的值变成了 11
// 排序过程的代码示例
$arr = [18,11,1,15,2,35,55,12,17,65,23,48,56,22,5];
// 外层第一次循环 $i = 0
// 内层 第一次循环,因为 $j = $i + 1 ,所以 $j = 1,
// 内层第 1 次循环时,18 > 11 所以进行交换
// [11,18,1,15,2,35,55,12,17,65,23,48,56,22,5]
// 内层第 2 次循环时,11 > 1 所以进行交换
// [1,18,11,15,2,35,55,12,17,65,23,48,56,22,5]
// 内层第 3 次循环时,1 < 15 所以不交换进行交换
// [1,18,11,15,2,35,55,12,17,65,23,48,56,22,5]
// ....
// 内层第一次全部循环完后,因为 1 是是最小的,后续都比它大,所以没有发生交换。
// 这时,外层进入第二次循环,继续重复上面对比的步骤