目录

PHP 选择排序

选择排序分为简单选择排序、树形选择排序和堆排序三类,此三类中,简单选择排序是最简单,也是最好理解的。

概念

选择排序 - Selection Sort:是一种简单直观的排序算法。顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完

步骤

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  2. 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
  3. 以此类推,直到所有元素均排序完毕

实现

方式一

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
<?php

class SelectionSort
{
    /**
     * 主运行方法
     *
     * @return void
     */
    public static function main(): void
    {
        $random = self::random();
        $array = self::sort($random);
        print_r($array);
    }

    /**
     * 选择排序
     *
     * @param array $array
     *
     * @return array
     */
    public static function sort(array &$array): array
    {
        $count = count($array);
        for ($i = 0; $i < $count; $i++) {
            $position = $i;
            for ($j = $i + 1; $j < $count; $j++) {
                if (self::compare($array[$position], $array[$j]) > 0) {
                    $position = $j;
                }
            }

            if ($position !== $i) {
                self::swap($array[$position], $array[$i]);
            }
        }

        return $array;
    }

    /**
     * 比较大小
     *
     * @param int $x
     * @param int $y
     *
     * @return int
     */
    private static function compare(int $x, int $y): int
    {
        return $x <=> $y;
    }

    /**
     * 互换位置
     *
     * @param int $x
     * @param int $y
     *
     * @return void
     */
    private static function swap(int &$x, int &$y): void
    {
        if ($x !== $y) {
            $t = $x;
            $x = $y;
            $y = $t;
        }
    }

    /**
     * 生成随机数组
     *
     * @param int $low
     * @param int $high
     * @param int $num
     *
     * @return array
     */
    private static function random(int $low = 1, int $high = 9999, int $num = 10): array
    {
        $num = $num > $high ? $high : $num;
        $range = range($low, $high);
        $array = array_rand(array_flip($range), $num);
        shuffle($array);

        return $array;
    }
}

SelectionSort::main();

// 结果
Array
(
    [0] => 312
    [1] => 1124
    [2] => 1267
    [3] => 1884
    [4] => 2609
    [5] => 4177
    [6] => 4773
    [7] => 7728
    [8] => 8237
    [9] => 8963
)

方式二

树形选择排序 - Tree Selection Sort:又名锦标赛排序,是一种按照锦标赛的思想进行选择排序的方法

1
2
3
<?php

// 这个算法目前搞不定,预留位置,待以后再实现

方式三

堆排序 - Heap Sort:是指利用堆这种数据结构所设计的一种排序算法。它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶

1
2
3
<?php

// 这个算法目前搞不定,预留位置,待以后再实现