1. 概述

  • 思路:循环数组,查找到最小元素,与当前元素换位置。
  • 稳定性:不稳定。(比如数组[5,8,5,2]中,为第一个元素找最小的数为2,交换5和2的位置,导致原序的两个5的前后顺序改变了)
  • 优化:前后指针,最大最小指针前后一起开弓。

    2. 实现代码

    ```php <?php class SelectSort { private $ori = []; public $new = []; public function __construct(array $arr) {

    1. $this->ori = $arr;
    2. $r = $this->select($this->ori);
    3. $this->new = $r;

    }

    private function select(array $arr) {

    1. for($i = 0; $i < floor(count($arr) / 2); $i++) {
    2. // 最大最小指针,前后一起处理
    3. $minPos = $i;
    4. $maxPos = count($arr) - 1 - $i;
    5. for ($j = $i + 1; $j < count($arr); $j++) {
    6. ($arr[$j] < $arr[$minPos]) && $minPos = $j;
    7. ($arr[count($arr) - 1 - $j] > $arr[$maxPos]) && $maxPos = count($arr) - 1 - $j;
    8. }
    9. $arr = $this->swap($arr, $i, $minPos);
    10. $arr = $this->swap($arr, count($arr) - $i - 1, $maxPos);
    11. }
    12. return $arr;

    }

    public function swap(array $arr, int $i, int $j) {

      $tmp = $arr[$i];
      $arr[$i] = $arr[$j];
      $arr[$j] = $tmp;
      return $arr;
    

    } }

$arr = [5, 3, 6, 8, 1, 7, 9, 4, 2]; $cls = new SelectSort($arr); print_r($cls->new); ```