希尔排序详解

2023-10-30

1.概述

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

        希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

2.步骤

希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。

3.图解

假设原始数组arr数据如下

初始增量gap=arr.length/2=8/2=4,意味着整个数组被分为4组,这四组分别使用插入排序如下

 继续进行增量排序gap=gap/2=4/2=2,,数组被重新分组为两组,对这两组使用插入排序继续进行排序

 直到增量排序gap=1时,将数组分为一组,数组无法再进行增量排序,则进行最后一次排序

经过最后一次的排序,整体宏观调控,微型调整,即可完成排序

4.代码实现

在我们的增量排序过程,对我们每一组的数据进行排序,这里可使用直接插入法和交换法两种,但是,直接插入法效率远高于交换法,所以在对分组数据排序时,建议使用直接插入法

4.1 希尔排序交换法

代码实现

    /**
     * 希尔排序
     */
    @Test
    public void testShellSort() {
        int[] arr = new int[]{1, 4, 6, 3, 8, 9, 2,  23};
        exchangeShellSort(arr);
//        insertShellSort(arr);
    }

    /**
     * 希尔排序-交换法
     * @param arr
     */
    public void exchangeShellSort(int arr[]) {
        int temp;//临时数据
        boolean flag = false;//是否交换
        int count = 1;//计数
//        分而治之,将数值分组排序,i为步长
        for (int i = arr.length / 2; i > 0; i /= 2) {
//            遍历分治的每一个分组
            for (int j = i; j < arr.length; j++) {
//                遍历分治的每一个分组的每一个值
                for (int k = j - i; k >= 0; k -= i) {
                    if (arr[k + i] < arr[k]) {
                        temp = arr[k + i];
                        arr[k + i] = arr[k];
                        arr[k] = temp;
                        flag = true;
                    }
                    if (!flag) {
                        break;
                    } else {
//                        为了下次判断
                        flag = false;
                    }
                }
            }
            System.out.println("希尔排序交换法第" + (count++) + "次排序后" + Arrays.toString(arr));
        }
    }

交换过程

 

 

4.2 希尔排序-插入法

代码实现

    /**
     * 希尔排序
     */
    @Test
    public void testShellSort() {
        int[] arr = new int[]{1, 4, 6, 3, 8, 9, 2,  23};
//        exchangeShellSort(arr);
        insertShellSort(arr);
    }

    /**
     * 希尔排序-插入法
     * @param arr
     */
    public void insertShellSort(int[] arr) {
        int count = 1;//计数
//        分而治之,循环为每次总数除二
        for (int i = arr.length / 2; i > 0; i /= 2) {
//            循环分治的每一个分组
            for (int j = i; j < arr.length; j++) {
                int index = j;
                int temp = arr[index];
//                比较每一组的值
                if (arr[index] < arr[index - i]) {
//                    如果比前面小就把前面的数值往后移,将合适的数值插入
                    while (index - i > 0 && temp < arr[index - i]) {
                        arr[index] = arr[index - i];
                        index -= i;
                    }
                    arr[index] = temp;
                }
            }
            System.out.println("希尔排序插入法第" + (count++) + "次排序后" + Arrays.toString(arr));
        }
    }

排序过程

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

希尔排序详解 的相关文章

随机推荐

  • Hadoop伪分布模式配置

    Hadoop共有三种部署方式 本地模式 伪分布模式及集群模式 本次安装配置以伪分布模式为主 即在一台服务器上运行Hadoop 如果是分布式模式 则首先要配置Master主节点 其次配置Slave从节点 以下说明如无特殊说明 默认使用root
  • QT多窗口

    常用的窗体基类是 QWidget QDialog 和 QMainWindow 在创建 GUI 应用程序时选择窗体基类就是从这 3 个类中选择 QWidget 直接继承于 QObject 是 QDialog 和 QMainWindow 的父类
  • 在学习Python时遇到的一些项目bug

    启动线程 开启任务时 1 出现错误TypeError init got an unexpected keyword argument arg ok python没有能解析出来这个参数 好吧少写了个s 加上就没啥问题了 2 出现错误TypeE
  • 丑数打表 & 计算 (自用)

    丑数定义 只包含因子2 3 5的正整数被称作丑数 define min a b a lt b a b define min4 a b c d min min a b min c d int choushu 5850 int main int
  • 代理模型:最小二乘支持向量回归(LSSVR)--- MATLAB程序

    写在开头 代理模型是工程问题中常用的一个优化方法 当实际问题计算量很大 不容易求解时 可以使用计算量较小 求解迅速的简化模型来替代原模型 加速优化过程 代理模型采用一个数据驱动的 自下而上的办法来建立 首先 通过抽样得到有限个样本点 输入
  • java烟花代码_一个美丽的java烟花程序

    import java awt import java applet import java awt event import javax swing public class ChatApplet extends Applet imple
  • Shell 从入门到精通(二)

    变量的赋值方式 定义或引用变量时注意事项 双引号是弱引用 单引号是强引用 即单引号是所见即所得 双引号是进行了赋值操作 两个反引号等价于 反引号的中的shell命令会被先执行 变量数值运算 1 整数运算 expr 五颗星 2 整数运算 四颗
  • Spring源码解析4.createBean()方法解析

    createBeanInstance protected BeanWrapper createBeanInstance String beanName RootBeanDefinition mbd Nullable Object args
  • ​LeetCode刷题实战336:回文对

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 回文对 我们先来看题面 htt
  • 山石岩读丨前沿领域探析——汽车CAN总线协议详解及攻击面分析

    1 CAN总线的基本概念以及由来 CAN Controller Area Network 总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线 它起初用于实现汽车内ECU之间可靠的通信 后因其简单实用可靠等特点 而广泛应用于工
  • 解读HashMap中put方法的源码

    解析hashMap的put方法是如何存储一个键值 一 put方法 代码1 1 V put K key V value 方法 public V put K key V value return putVal hash key key valu
  • Java 面向对象之多态

    目录 1 接口 1 1 接口中成员的访问特点 1 2 默认方法 1 3 静态方法 1 4 私有方法 1 5 小结 2 多态 2 1 多态中成员的访问特点 2 2 多态的好处和弊端 2 3 多态中的转型 3 内部类 3 1 成员内部类 3 2
  • SpringBoot框架总结

    SpringBoot框架总结 一 SpringBoot框架的概念 1 传统框架的弊端 例如传统的SSM框架整合了MyBatis Spring SpringMVC框架 但其需要繁琐且重复的配置使程序员很是痛苦 2 SpringBoot框架 S
  • ros中编译release版本

    catkin build cmake args DCMAKE BUILD TYPE Release
  • Java做一个进制转换小工具

    通过swing和awt实现的一个简单的进制转换工具 可以进行数之间的进制转换 只有两个类 所有代码都放在https github com 13337356453 BHD Converter 可自行下载 因为某些特殊的原因 没有把窗口弄得更漂
  • Selenium中的断言(python篇)

    Selenium常用的断言包括 页面属性断言 断言标题 url或页面源码中是否包含或不包含特定字符 元素存在断言 断言指定元素存在 图片及链接断言 断言图片正常显示 链接可以正常打开 页面属性断言 这是最常用的断言方式 可以用来断言页面是否
  • 李开复创业--创新工场未来的前景是怎样?

    创新工场现在是房子不小 人不多 这个星期我们招聘了第七个人 节目还没开始 李开复对本报道如是说 十一 长假 他赶赴美国与投资商谈融资 同时不忘到两所知名高校演讲招揽人才 现在 刚刚满月的 创新工场 未来的前景是怎样 招聘人才一个月 招揽人才
  • 面试题10道02 2021.11.26

    1 什么是HTTP报文 Http报文就是客户端和服务端之间传送的数据块 2 HTTP报文由哪三部分组成 HTTP报文由起始行 头部 主体组成 其中起始行是对该报文进行的描述 头部是对报文的属性进行的描述 主体则是数据的内容 3 HTTP报文
  • Movidius神经计算棒5-编译ncsdk

    上面是我的微信和QQ群 欢迎新朋友的加入 这里有个小提示 先把硬件接上电脑 否则会编译报错 然后最好不要用USB HUB线 make install 完成之后如下所示 make examples 完成之后是这样的 测试
  • 希尔排序详解

    1 概述 希尔排序 Shell s Sort 是插入排序的一种又称 缩小增量排序 Diminishing Increment Sort 是直接插入排序算法的一种更高效的改进版本 希尔排序是非稳定排序算法 该方法因 D L Shell 于 1