前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >排序算法-希尔排序

排序算法-希尔排序

作者头像
guanguans
发布2018-05-09 10:31:18
4160
发布2018-05-09 10:31:18
举报
文章被收录于专栏:琯琯博客琯琯博客

排序算法-希尔排序

代码语言:javascript
复制
<?php
/**
 * 希尔排序.
 *
 * 算法思路:
 * 给定一个初始步长,一般为序列长度的一半
 * 按步长分组
 * 每组进行插入排序
 * 取当前步长的一半为下个步长,继续上面的算法
 * 直到步长为1结束
 *
 * @param array $value 待排序数组
 * @param array $increment 步长 初始数组长度向下取整
 *
 * @return array
 */
function shell(&$value = [], $increment) {
    // 步长小于1为止
    if ($increment < 1) {
        return;
    }
    // 分组插入排序
    // 循环步长次
    $a = 0;
    while ($a < $increment) {
        // 每组进行插入排序
        // 直到待插入值不存在为止
        $point = $a; // 已排序末尾初始位置
        while (isset($value[$point + $increment])) {
            $next = $value[$point + $increment]; // 待插入值
            // 插入逻辑
            for ($i = $point;$i >= $a;$i-= $increment) {
                // 当前值大于待插入值 则后移步长当前值
                if ($value[$i] > $next) {
                    $value[$i + $increment] = $value[$i];
                    // 如果当前为首位索引位置 则当前位置插入待插入值
                    if ($i === $a) {
                        $value[$i] = $next;
                    }
                    continue;
                }
                // 当前值小于或者等于待插入值 则在上一个步长位置插入待插入值
                $value[$i + $increment] = $next;
                break;
            }
            $point+= $increment;
        }
        ++$a;
    }
    // 递归
    shell($value, floor($increment / 2));
    return $value;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档