[关闭]
@Chiang 2020-03-04T10:56:26.000000Z 字数 701 阅读 709

选择排序

算法 2020-03


思路分析

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

选择排序

代码实现

  1. /*
  2. * @param 选择排序法
  3. * 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
  4. * */
  5. function selectSort($arr){
  6. //双重循环完成,外层控制轮数,内层控制比较次数
  7. $len = count($arr);
  8. if ($len <= 1) {return $arr;}
  9. for ($i = 0; $i < $len-1; $i++) {
  10. $minIndex = $i;
  11. // 找出i后面最小的元素与当前元素交换
  12. for ($j = $i + 1; $j < $len; $j++) {
  13. if ($arr[$minIndex] > $arr[$j]){
  14. $minIndex = $j;
  15. }
  16. }
  17. if ($minIndex != $i) {
  18. $temp = $arr[$i];
  19. $arr[$i] = $arr[$minIndex];
  20. $arr[$minIndex] = $temp;
  21. }
  22. }
  23. return $arr;
  24. }

小结

  • 时间复杂度:O(n^2)
  • 不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
  • 在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了
  • 最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快

参考资料:
PHP常见排序算法学习

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注