码迷,mamicode.com
首页 > 编程语言 > 详细

希尔排序

时间:2021-06-17 16:36:09      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:for   amp   操作   完成   ESS   print   思路   UNC   初始   

基本思路

希尔排序可以看成是插入排序的进化版。在上一篇博文中我们学习了插入排序,可以得出两个结论:

  1. 对于少量元素的排序,插入排序是一个有效的算法。

  2. 插入排序依赖输入元素的初始顺序,若初始的顺序越有序,插入排序就越快。

希尔排序就是根据这两点来进行插入排序的改进:通过某个增量将数组元素划分为若干组,然后分组进行插入排序,目的是在满足上述结论1的条件下,让输入数组的元素局部有序。随后逐步缩小增量,继续按组进行插入排序操作,直至增量为0,我们就完成了排序。以数组arr = [20, 9, 1, 90, 40, 25, 60, 80, 100, 88, 200,10]为例说明:

  • 设定增量h=4,我们把数组分为四组,分别是[20, 40, 100],[9, 25, 88],[1, 60, 200],[90, 80, 10],我们分别对四个数组进行插入排序。
  • 增量递减h=h/3,再进行分组和插入排序直到增量小于1。

PHP代码

递增序列的选择会影响希尔排序的性能,但现今也没有证明哪个序列是最好的。我们以序列{1, 4, 13, 40, 121, 364...}来编写希尔排序的代码。

function shell_sort(array &$arr)
{
    $n = count($arr);
    $h = 1;
    while (3*$h < $n) $h = 3*$h + 1;
    while ($h >= 1) {
        for ($i = $h; $i < $n; $i++) {
            for ($j = $i; $j >= $h && less($arr, $j, $j - $h); $j -= $h) {
                exch($arr, $j, $j - $h);
            }
        }
        $h = intval($h / 3);
    }
}

function less(array $arr, int $i, int $j)
{
    return $arr[$i] < $arr[$j];
}


function exch(array &$arr, int $i, int $j)
{
    list($arr[$i], $arr[$j]) = [$arr[$j], $arr[$i]];
}


$arr = [];
for ($i = 0; $i < 100; $i++) {
    $arr[$i] = rand(0, 10000);
}
print_r($arr);
shell_sort($arr);
print_r($arr);

希尔排序

标签:for   amp   操作   完成   ESS   print   思路   UNC   初始   

原文地址:https://www.cnblogs.com/tianjiankun/p/14890996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!