1. 概述

  • 思路:取一个按规律缩小的间隔直至间隔缩小到1,每取一次间隔要对所有的数进行一次插入排序,以此来达到排序目的。和希尔排序相比,间隔大的是否排序少,间隔小的时候排序数在附近。
  • 稳定性:不稳定(因为在每次间隔排序的时候,原序一样大小的数字可能分到不同组,不同组在排序时就改变了同大小数字的位置)

    2. 实现代码

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

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

    }

    private function shell(array $arr) {

    1. // 确定间隔(Knuth序列,有其他序列:质数序列)
    2. $h = 1;
    3. while ($h <= count($arr) / 3) {
    4. $h = $h * 3 + 1;
    5. }
    6. // 循环步长
    7. for ($gap = $h; $gap > 0; $gap = ($gap - 1) / 3) {
    8. echo $gap."\t";
    9. // 需要与前面数据对比的元素
    10. for ($i = $gap; $i < count($arr); $i++) {
    11. // 按照间隔对比并交换数据
    12. for ($j = $i; $j > $gap - 1; $j -= $gap) {
    13. if ($arr[$j] < $arr[$j - $gap]) {
    14. $arr = self::swap($arr, $j, $j - $gap);
    15. }
    16. }
    17. }
    18. }
    19. return $arr;

    }

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

    1. $tmp = $arr[$i];
    2. $arr[$i] = $arr[$j];
    3. $arr[$j] = $tmp;
    4. return $arr;

    } }

$arr = [9, 6, 11, 3, 5, 12, 8, 7, 10, 15, 14, 4, 1, 13, 2]; $cls = new ShellSort($arr); print_r($cls->new); ```