[算法]希尔排序——插入排序的升级

news2024/9/28 3:21:41

参考:《漫画算法-小灰的算法之旅》

目录

1、希尔排序的思想

2、例子

3、希尔排序代码

4、希尔排序的优化

5、希尔排序是不稳定排序


问:什么情况下插入排序的工作量会比较小呢?

答:首先,当数组元素较小时,插入排序的工作量会比较小。因为插入排序的时间复杂度是O(n^2),工作量和n^2成正比,如果n比较小,那么排序的工作量自然会小得多。 其次,当数组大部分元素有序的时候,插入排序的工作量也会相对 较小。因为在这种情况下,数组中的元素并不需要进行频繁的比较和交换。

希尔排序的思想就与上面回答的意思相似,下面来说明。

1、希尔排序的思想

将原始数组逐步分组进行粗调,在进行直接插入排序的思想。

2、例子

原始数组如下:

 首先将元素两两分组,同组两个元素之间的跨度时数组总长度的一半。在该例中分组跨度为4。

 如上图所示,元素5和元素9一组,元素8和元素2一组,元素6和元素1一组,元素3和元素7一组,一共4组。

接下来,我们让每组元素进行独立排序,排序方式用直接插入排序 即可。由于每一组的元素数量很少,只有两个,所以插入排序的工作 量很少。每组排序完成后的数组如下:

我们可以进一步缩小分组跨度,重复上述工作。把跨度缩小为原先的一半,也就是跨度为2,重新对元素进行分组:

如图所示,元素5,1,9,6一组,元素2,3,8,7一组,一共两组。 接下来,我们继续让每组元素进行独立排序,排序方式用直接插入排序即可。每组排序完成后的数组如下: 

此时,数组的有序程度进一步提高,为后续将要进行的排序铺平了 道路。 最后,我们把分组跨度进一步减小,让跨度为1,也就等同于做直 接插入排序。经过之前的一系列粗略调整,直接插入排序的工作量减 少了很多,排序结果如下:

上面示例中所使用的分组跨度(4,2,1),被称为希尔排序的增量,增量的选择可以有很多种。我们在示例中所用的逐步折半的增量 方法,是Donald Shell在发明希尔排序时提出的一种朴素方法,被称 为希尔增量

3、希尔排序代码

4、希尔排序的优化

希尔排序利用分组的粗调方式减少了直接插入排序的工 作量,使得算法的平均时间复杂度低于O(n^2)。 但是,在某些极端情况下,希尔排序的最坏时间复杂度仍然是 O(n^2),甚至比直接插入排序更慢。例如:

上面这个数组,如果我们照搬之前的分组思路,无论是以4为 增量,还是以2为增量,每组内部的元素都没有任何交换。一直到我们 把增量缩减为1,数组才会按照直接插入排序的方式进行调整。 对于这样的数组,希尔排序不但没有减少直接插入排序的工作量, 反而白白增加了分组操作的成本。 

每一轮希尔增量之间是等比的,这就导致了希尔增量存在盲区。为了避免这样的极端情况,可以选择更有效的增量方式,即保证每一轮的增量彼此"互质“。如:

  • Hibbard的增量序列如下:1, 3, 7, 15……最坏时间复杂度是O(n^3/2)。
  • Sedgewick的增量序列如下: 1, 5, 19, 41, 109……最坏时间复杂度是O(n^4/3)。

5、希尔排序是不稳定排序

希尔排序是不稳定排序,值相同的元素有可能被调换位置。例子:

 在上面的数组中,有两个元素5,黄色的5在前,橙色的5在后。 假如我们按照希尔增量分组,第1轮粗调(增量为4)之后,黄色的 元素5会和元素4交换,换到橙色的5后面:

 最终排序结果:

 相同的元素5,在排序之后改变了次序,由此可见希尔排序是一个 不稳定排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Halcon的MLP(多层感知神经网络)分类器分类操作实例

一、介绍 人工神经网络(Artificial Neural Network,ANN)简称神经网络(Neural Network,NN)或类神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 MLP神经网络是一种基于神经网络、动态的分类器。MLP分类器使用神经…

C51---智能感应垃圾桶

1.器件:C51、蜂鸣器、SG90舵机、HC-SR04超声波测距 2.实现功能:超声波感应,舵机转动打开垃圾桶,蜂鸣器发出提示,LED灯亮 3.代码: #include "reg52.h" #include "intrins.h" //距离小…

关于进程与进程调度

目录什么是进程进程管理进程的结构体(PCB)里的属性并行与并发什么是进程 一个运行起来的程序就是进程. 比如文件名是以 exe 结尾的就是一可执行文件(程序) 双击QQ.exe文件, 这个程序就跑起来了, 它在系统中形成了一个进程, 那我们怎么看到进程呢? 可以打开任务管理器, 点开进…

Spark MLlib 模型训练

Spark MLlib 模型训练决策树随机森林GBDTSpark MLlib 开发框架下 : 监督学习 : 回归 (Regression) , 分类 (Classification) , 协同过滤 (Collaborative Filtering)非监督学习 : 聚类 (Clustering) 、频繁项集 (Frequency Patterns) 例子分类 : 算法分类 : 算法分类算法子分类…

探究SMC局部代码加密技术以及在CTF中的运用

前言 近些日子在很多线上比赛中都遇到了smc文件加密技术,比较出名的有Hgame杭电的比赛,于是我准备实现一下这项技术,但是在网上看了很多文章,发现没有讲的特别详细的,或者是无法根据他们的方法进行实现这项技术,因此本篇文章就是…

Springboot怎么快速集成Redis?

前言其实在Springboot中集成redis是一个非常简单的事情,但是为什么要单独输出一篇文章来记录这个过程呢?第一个原因是,我记性不是太好,这次把这个过程记录下,在新的项目搭建的时候或者需要在本地集成redis做一些其他相…

51红外循迹智能车——红外循迹模块设计

目录 赛道环境 红外传感器的特征 TCRT5000传感器 LM339单限电压比较器 LM339简介 ​编辑 单限电压比较器仿真 红外循迹模块的设计 红外循迹模块原理图 红外循迹模块原理图讲解 赛道环境 上图为赛道示意图,两端为黑色,中间为白色 红外传感器的…

小孩用什么样的台灯比较好?2023眼科医生青睐的儿童台灯推荐

小孩子属于眼睛比较脆弱的人群,所以选购护眼台灯时,选光线温和的比较好,而且调光、显色效果、色温、防蓝光等方面也要出色,否则容易导致孩子近视。 1、调光。台灯首先是照度高,国AA级+大功率发光&#xff0…

Yolov5目标检测算法解析:模型结构

Yolov5系列是Yolo家族新一代的模型,相比于之前的版本Yolov3和Yolov4,相同的是,它依然采用锚框(anchor)对目标的尺寸进行回归的思想,保持大中小多种尺度特征输出,所不同的是,Yolov5系…

SQL 进阶刷题笔记

SQL 进阶刷题笔记 一、MySQL 进阶 这里主要是 MySQL 刷题相关笔记,方便后面温习和查阅,希望可以帮到大家!!! 题1 请计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score&#xff0…

TCP和UDP对比

TCP和UDP对比 UDP(用户数据报协议) 无连接(指的是逻辑连接关系,不是物理上的连接) 支持单播、多播以及广播,也就是UDP支持一对一、一对多、一对全 面向应用报文的,对应用层交付的报文直接打包 无连接不可靠的传输服务(适用于IP电话、视频会议等实时应用),不使用流量控制和…

易优cms range 范围判断标签

range 范围判断标签 【基础用法】 标签:range 描述:范围判断标签包括in notin between notbetween四个标签,都用于判断变量是否中某个范围。 用法: {eyou:range name$eyou.field.typeid value1,2,3,4 typein} 输出内容 {/e…

HTTPS加密解析

日升时奋斗,日落时自省 目录 1、加密解释 2、对称加密 3、非对称加密 4、证书 HTTPS(HyperText Transfer Protocol over Secure Socket Layer)也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层 HTTP协议内容都是按…

卷积神经网络(CNN)基础知识

文章目录CNN的组成层卷积层卷积运算卷积的变种分组卷积转置卷积空洞卷积可变形卷积卷积层的输出尺寸和参数量CNN的组成层 在卷积神经⽹络中,⼀般包含5种类型的⽹络层次结构:输入层、卷积层、激活层、池化层和输出层。 输入层(input layer&a…

Android Audio HAL 服务

在 Android 系统中,Audio HAL 服务用于管理对音频硬件的访问,AudioFlinger 通过 Audio HAL 服务访问音频硬件。这里以 Android Automotive (AAOS) 版模拟器为例,来看 Audio HAL 服务的设计、实现和访问,代码分析基于 android-12.1…

【JavaSE】数组的定义和使用(下)

数组的定义和使用(下)4. 数组练习4.1 模拟实现toString4.2 数组拷贝4.3 比较两个数组是否相同4.4 填充数组4.3 求数组中元素的平均值4.4 查找数组中指定元素(顺序查找)4.5 查找数组中指定元素(二分查找)4.6…

力扣-树节点

大家好,我是空空star,本篇带大家了解一道中等的力扣sql练习题。 文章目录前言一、题目:608. 树节点二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …

基于nvidia xavier智能车辆自动驾驶域控制器设计与实现-百度Apollo架构(二)

智能车辆操作系统 智能车辆操作系统是智能车辆系统的重要组成部分。现代汽车软件组件通常首 先由不同的供应商开发,然后在有限的资源下由制造商进行集成[42]。智能车辆操作 系统需要采用模块化和分层化设计思想来兼容传感器、分布式通信和自动驾驶通用 框架等模块&a…

适当的合同管理有什么积极影响?若管理不善有什么后果?

合同管理将决定合同是主要的风险因素还是业务增长的工具。事实是,如何处理合同会影响企业的底线。据研究显示,糟糕的合同管理使企业每年损失超过9%的收入。实施合同管理最佳实践将帮助企业提高合同签约效率。 什么是合同管理? 合同管理是对合…

玩转CodeQLpy之用友GRP-U8漏洞挖掘

0x01 前言CodeQLpy是作者使用python3实现的基于CodeQL的java代码审计工具,github地址https://github.com/webraybtl/CodeQLpy。通过CodeQLpy可以辅助代码审计人员快速定位代码中的问题,目前支持对SprintBoot的jar包,SpringMVC的war包&#xf…