希尔排序算法实例讲解_十大算法排名

希尔排序算法实例讲解_十大算法排名一、什么是希尔排序1.概念希尔排序(ShellSort)是把记录按下标的一定增量分组,对每组使用插入排序算法,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分为一组,算法终止2.算法原理这是一个无序数列:1、5、8、4、7、2、6、3,我们要将它按从小到大排序。按照希尔排序的思想,我们先把数列进行分组排序首先,我们选择序列长度的一半4,作为增量进行分组如果所示,1和7一组,5和2一组,8和6一组,4和3一组,共四组然后,我们对每一组进行插入排序,排序后序列如下经

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

十大经典排序算法

一、什么是希尔排序

1.概念

希尔排序(Shell Sort)是把记录按下标的一定增量分组,对每组使用插入排序算法,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分为一组,算法终止

2.算法原理

这是一个无序数列:1、5、8、4、7、2、6、3,我们要将它按从小到大排序。按照希尔排序的思想,我们先把数列进行分组排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3mJDYTFM-1591770808598)(./希尔1.png)]
首先,我们选择序列长度的一半4,作为增量进行分组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSodnhEj-1591770808600)(./希尔2.png)]
如果所示,1和7一组,5和2一组,8和6一组,4和3一组,共四组

然后,我们对每一组进行插入排序,排序后序列如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e1U9xjSX-1591770808601)(./希尔3.png)]
经过这一轮排序,序列有序了很多,接着我们进一步缩小增量,增量缩小为原来的一半,也就是2,再进行分组排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0AXx9M0-1591770808602)(./希尔4.png)]
如图所示,1、6、7、8一组,2、3、5、4一组,共两组

我们再对每一组进行插入排序,排序后序列如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVZQ7HZY-1591770808604)(./希尔5.png)]
最后,我们进一步把增量缩小为原来一半,也就是1,这相当于直接在序列上进行插入排序,排序结果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0x3LrwTY-1591770808607)(./希尔6.png)]
至此所有的元素都是有序的

3.算法实现

function sort(arr) {
    // 希尔排序的增量
    let d = arr.length;
    while (d > 1) {
        // 使用希尔增量的方式,每次折半
        d = parseInt(d / 2);
        for (let x = 0; x < d; x++) {
            for (let i = x + d; i < arr.length; i = i + d) {
                let temp = arr[i];
                let j;
                for (j = i - d; j >= 0 && arr[j] > temp; j = j - d) {
                    arr[j + d] = arr[j];
                }
                arr[j + d] = temp;
            }
        }
    }
}

let arr = [1, 5, 8, 4, 7, 2, 6, 3];
sort(arr);
console.log(arr);

Jetbrains全家桶1年46,售后保障稳定

二、希尔排序算法特点

1.时间复杂度

希尔排序算法利用分组粗调的方式减少了插入排序算法的工作量,使得算法的平均复杂度低于O(N^2)

但某些极端的情况下,希尔排序算法的时间复杂度仍然是O(N^2),甚至比插入排序算法更慢
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EO2azRMG-1591770808608)(./希尔7.png)]
上图是我们刚刚希尔排序例子里,进行最后一次增量为1时排序前的序列,如果初始序列就是这个,那么前面进行的增量为4、增量为2的排序,都没有产生任何元素的交换,反而增加了分组操作的成本

为了降低希尔排序算法的时间复杂度,提出了更严谨的算法增量

  • Hibbard增量,序列为:1、3、7、15…,通项公式为2^k-1, 最坏的时间复杂度为O(n^(3/2))
  • Sedgewick增量,序列为:1、5、19、41、109…,通项公式为 9 * 4^k – 9 * 2^k + 1 或者 4^k – 3 * 2^k + 1,最坏的时间复杂度为O(n^(4/3))

2.空间复杂度

希尔排序算法排序过程中需要一个临时变量存储插入元素,所需要的额外空间为1,因此空间复杂度为O(1)

3.稳定性

希尔排序算法会进行分组排序,在分组排序的过程中有可能改变相同元素的前后位置,因此是一种不稳定的排序算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zjhs2mU-1591770808610)(./希尔8.png)]
上图例子中,绿色5在紫色5之前,但经过希尔排序之后,绿色5在紫色5之后,所以希尔排序是一种不稳定排序算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215565.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月13日 下午12:43
下一篇 2025年7月13日 下午1:22


相关推荐

  • java saxreader 字符串_Java SAXReader.read方法代碼示例

    java saxreader 字符串_Java SAXReader.read方法代碼示例本文整理匯總了Java中org.dom4j.io.SAXReader.read方法的典型用法代碼示例。如果您正苦於以下問題:JavaSAXReader.read方法的具體用法?JavaSAXReader.read怎麽用?JavaSAXReader.read使用的例子?那麽恭喜您,這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類org.dom4j.io.SAXRea…

    2022年6月22日
    46
  • 详解 Pytorch 实现 MNIST[通俗易懂]

    MNIST虽然很简单,但是值得我们学习的东西还是有很多的。项目虽然简单,但是个人建议还是将各个模块分开创建,特别是对于新人而言,模块化的创建会让读者更加清晰、易懂。CNN模块:卷积神经网络的组成;train模块:利用CNN模型对MNIST数据集进行训练并保存模型test模块:加载训练好的模型对测试集数据进行测试cnn.pt:train的CNN模型注意!有GPU的小伙伴尽量使用GPU训练,GPU的训练速度比CPU的训练速度高许多倍,可以节约大量训练时间CNN模块MN

    2022年4月8日
    86
  • java jcf查看_JCF简单总结

    java jcf查看_JCF简单总结JCF JavaCollecti 即 Java 中运用最为广泛的 Java 集合类 它是 Java 对常用数据结构的封装 包含于 java util 包中 所谓集合就是在类内部对数据进行组织的载体 JavaAPI 提供了一系列类的实例 用来在程序中存放对象 Java 集合将接口和实现进行了分离 其接口与类的结构如下 JCF 接口结构 Iterable Collection List

    2026年3月19日
    2
  • UART串口通讯协议解析

    UART串口通讯协议解析UART 串口通讯协议解析概述接口通信协议概述通用异步收发传输器 UniversalAsy Transmitter 通常称作 UART 它将要传输的资料在串行通信与并行通信之间加以转换 作为把并行输入信号转成串行输出信号的芯片 UART 通常被集成于其他通讯接口的连结上 具体实物表现为独立的模块化芯片 或作为集成于微处理器中的周边设备 一般是 RS 232C 规格的 与类似 Maxim 的 MAX232 之类的标准信号幅度变换芯片进行搭配 作为连接外部设备的接口 在 UART 上追加

    2026年3月18日
    3
  • 学习web前端,初学者应该用什么编程软件

    学习web前端,初学者应该用什么编程软件Web前端开发最常见的编程软件有以下几种: DreamWeaver是一款老牌前端开发工具,功能强大且组件丰富,作为前端开发的一款利器被广泛使用。DreamWeaver是一款可视化的前端开发工具,一边写代码一边就能看到效果,所以使用起来还是比较方便的。但是DreamWeaver的缺点就是比较耗费系统资源,这也许是IDE类产品的通病。 Hbuilder是最近几年被广泛使用的一款前端开发…

    2022年5月23日
    53
  • oracle安装完如何使用,Oracle11g安装及使用详解

    oracle安装完如何使用,Oracle11g安装及使用详解一、首先我们在官网下载Oracle11g,链接如下:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html注意系统位数和文件个数两个文件都要下载,过程可能比价漫长,可以敲会代码或者做几篇阅读理解缓解一下情绪(为接下来操蛋的安装过程做好充分的心理准备)二、安装可以参考已下链接http://…

    2022年7月25日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号