介绍

选择排序 主要是先假设数列中的第一个元素是最小,然后循环和数列中除本身外的每一位进行比较,如果碰到比它小的,就交换位置后继续比较。

实例

  1. $arr = [18,11,1,15,2,35,55,12,17,65,23,48,56,22,5];
  2. // 控制循环对比的轮数
  3. for($i = 0; $i < count($arr); $i++){
  4. // 实际对每一位进行循环对比
  5. for($j = $i+1; $j<count($arr); $j++){
  6. // 每次从数组中去一位 和该元素后面身下的元素进行对比
  7. if($arr[$i] > $arr[$j]){
  8. $tmp = $arr[$i];
  9. $arr[$i] = $arr[$j];
  10. $arr[$j] = $tmp;
  11. }
  12. }
  13. }

代码分析

第一轮循环,取外层循环的 $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 是是最小的,后续都比它大,所以没有发生交换。
// 这时,外层进入第二次循环,继续重复上面对比的步骤