php实现希尔排序

1.希尔排序的概念

在上一篇中我讲到了插入排序(http://blog.csdn.net/u013252047/article/details/79222503),希尔排序就是在插入排序上做了点变动。那为什么出现希尔排序呢?上一篇中我也讲到了,当初始序列无序时,插入排序每次只能将数据移动一位,效率较低,当初始序列基本有序时,直接插入只需经过少量的比较即可完成排序。于是就出现了希尔排序。希尔排序的基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量  dt=1(  dt<dt-1  …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

2.图解,用画图来一步一步实现是怎么排序的






3.代码实现

$array = [12,56,98,32,16,34,2,9,1];
function shellInsertSort(&$array,$n,$dk){
    for ($i=$dk;$i<$n;$i++) {
        $target = $array[$i];
        $j = $i;
        while (($j-$dk)>=0 && $target<$array[$j-$dk]) {
            $array[$j] = $array[$j-$dk];
            $j-=$dk;
        }
        $array[$j] = $target;
    }
}

function shellSort(&$array,$n) {
    $dk = (int)($n / 2);    //步调
    while ($dk >= 1) {
        shellInsertSort($array,$n,$dk);
        $dk = (int)($dk / 2);
    }

}
$len = count($array);
shellSort($array,$len);
dump($array);

4.效果展示


希尔排序是不稳定的,因为元素之间的比较是各个子序列中的元素比较。相对于整个待排序列而言,某一个元素可能会跳跃性地移动。

用这个例子和插入排序相比,插入排序交换了27次,希尔排序交换了13次,交换的次数变少了。

效果展示来自http://blog.jobbole.com/11745/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值