希尔排序听起来有点难,其实很简单

前言

直接插入排序当待排序数据的顺序和期望排序结果相反时,排序效率是最差的;上次聊到的折半插入排序只是减少有序列表的比较次数,而对于整体数据遍历次数还是没有得到优化;接下来要说的希尔排序就是针对整体数据进行优化,从而提升排序效率。

正文

1.1 希尔排序算法思想

希尔排序(Shell's Sort)是直接插入排序算法的改进版,又称“缩小增量排序”(Diminishing Increment Sort);

算法思想

将待排序数据根据指定步长进行分组,分别进行直接插入排序;减小步长,重复分组,重复直接插入排序,直到步长为1时进行最后一次插入排序。

对于第一次步长可以根据需要自定义,但一般推荐会设置为元素个数除以2(lenght/2),后续的步长依次是上一次步长除以2(stepk=stepk-1/2),直到步长为1,如下图:

image-20210407235130599

上面说到步长可以理解为增量,而减少步长的过程,也就是缩小增量,即希尔排序又称为缩小增量排序。

分组原理(第一次分组的step1=6/2=3):

  • 第一组:0索引位的元素为2,0+step1的索引位为3,对应的元素是1,3+step1越界了,则第一组的元素为2、1;

  • 第二组:1索引位的元素为5,1+step1的索引位为4,对应的元素是9,4+step1越界了,则第二组的元素为5、9;

  • 第三组:2索引位的元素为6,2+step1的索引位为5,对应的元素是3,5+step1越界了,则第三组的元素为6、3;此时元素就分组完成了;

接下来的分组就依次递减步长,即上一次步长除以2取整;然后根据新算出来的步长继续将上一次的排序的结果分组即可;直到步长递减到为1时,整体进行最后一次直接插入排序为止;

1.2 希尔排序算法实现与解析

代码实现(升序):

代码

运行结果如下:

结果

步骤解析:

步骤

上图步骤说明:

  • 将原始数据array复制到新数组中arrayb中,这步的主要目的是后续不需要声明额外临时变量,也为了后续核心代码实现逻辑简单易懂,减少过多的判断;0索引位也充当为哨兵位;

  • 第一步根据元素个数算出第一次步长step1=3,根据步长将待排序数据进行虚拟分组,索引位为1的元素和索引位为1+step的元素为一组,索引位为2的元素和索引位为2+step的元素为一组,索引位为3的元素和索引位为3+step的元素为一组;则将待排序数据分为2、1;5、9;6、3 三组;

  • 第二步开始遍历每一组数据,针对每一组数据进行直接插入排序;首先是第一组数据2、1,将待排序数据1放入哨兵位(即0索引位),哨兵位的数据1和有序列表中的2进行比较,2大于1,则需要腾出空位,所以2移到分组中索引位为4的位置;然后将哨兵位的数据1插入到腾出的空位中;

  • 第三步遍历第二组数据5、9,首先将待排序数据9放入哨兵位(即0索引位),哨兵位的数据9和有序列表中的5进行比较,5小于9,则不需改变位置;

  • 第四步遍历第三组数据6、3,首先将待排序数据3放入哨兵位(即0索引位),哨兵位的数据3和有序列表中的6进行比较,6大于3,则需要腾出空位,所以6移到分组中索引位为6的位置;然后将哨兵位的数据3插入到腾出的空位中;

  • 分组排序完成之后,最终得出第一次分组排序结果:

第一次分组排序完成之后,调整步长,继续进行分组,由于第二次计算出的步长step2=step1/2=1,即将所有上一次分组的数据全部为一组进行最后一次直接插入排序即可;这里就不在重复演示了,具体步骤和之前说到的直接插入排序一样,参照这篇大牛领导单独找我聊了两句:搞框架的同时别忘了算法。

通过第二次插入排序完成之后就得到最后的排序结果啦。

1.3 希尔排序算法分析

时间复杂度

时间复杂度最坏情况和直接插入排序的时间复杂一样,都是O(n2),但有其他大神经过大量演示,希尔排序的时间复杂度一般为O(n(1.3~2)),比O(n2)性能好。

空间复杂度
在算法核心部分只采用了固定的几个中间变量((i,j,step,arrayb[0])),所以算法过程中消耗的内存是一个常量,则空间复杂度为O(1)

稳定性
由于在排序过程中是根据步长将原始数据进行分组,这样就可能会导致相同的元素分到不同组,在最终排序时就不能保证原来两个相同元素的顺序啦,所以希尔排序是不稳定的

综上所述,希尔排序的时间复杂度为O(n2),空间复杂度为O(1),是不稳定算法;

总结

到这里,插入排序的三种排序介绍完毕,下期开始介绍交换排序;这里先总结一下插入排序的相关关键点(下图绿色部分);如下:

总结

感谢小伙伴的:点赞收藏评论,下期继续~~~

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

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

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

相关文章

等我敲完这行代码,就和你离婚!

工作是高端大气上档次,工资是低调奢华接地气!我们叫做“程序猿”,也叫“攻城狮”!但是往往城还没攻下来,我们的头发就先掉下来!我们最喜欢听的一句话就是☟段子一“等我敲完这行代码,就和你离婚…

深夜,学妹遇到了数据分析师生涯的第一个疑问

大家好,我是大鹏,目前是一名数据分析师。自从上次学妹深夜给我发微信,询问数据分析师招聘要求和需要掌握的技能,已经过去2个月了。直到昨天,我再次收到了学妹的召唤:当天深夜 学妹深夜求助,定是…

你知道WPF与WinForms的区别吗?

介绍WPF的缩写指微软的Windows Presentation Foundation,而WinForms是Windows Forms Applications的简单组合。这两个都是微软的Windows应用程序图形用户界面,开发人员可以使用它们来开发Windows桌面应用程序。本文重点介绍两种开发Windows桌面应用程序的…

一起谈.NET技术,发布NGuestBook(一个基于.NET平台的分层架构留言本小系统)

发布NGuestBook的动机说明 大约在半年前,我在博客上发表了一个系列文章:《基于.NET平台的分层架构实战》。当时在讲解过程中用到了一个叫NGuestBook的案例,在那以后,有很多朋友留言或发E-mail希望能得到NGuestBook的完整源代…

当Java、C++、Python等编程语言都变成妹子。。。

试想一下,当Java、C、Python、Ruby、PHP、C#、JS等编程语言变成了动漫人物会是怎样的一幅场景呢?下面就一起看看在日本作家渡辺将人的笔下,各种编程语言都是哪类“美女”的吧!Java犹如宫泽贤治的《不畏风雨》中出现的、性格木讷的…

对MySQL 进行深入学习是非常必要的

MySQL 在互联网行业非常流行,腾讯,阿里等互联网巨头都在深入使用MySQL, 我在腾讯时也使用MySQL,我在微信群里经常听到大家对MySQL 的意见也很大。在传统企业环境下使用最多的数据库产品是Oracle,SQL Server等企业级数据库&#xf…

4月 .NET 线上 Meetup,快来报名

点击蓝字关注我们.NET 6 preview 2 在3月11日已经发布,.NET 6 将是 .NET Core 3.1 之后的第一个 LTS 版本,也是微软开启全平台统一一个 .NET 计划以来的第一个 LTS 版本,意义不可谓不大,那么 .NET 5/6 又会带来哪些新特性呢&#…

机器学习资料第3版,助你继续成长!

之前分享的两份机器学习资料得到很多人的支持,因此小编决定再分享一份机器学习的资料。前两份资料传送门:【资源】机器学习资料包来袭机器学习资料升级版来了!!!现在,再来看看有什么新资料吧。How to Build…

人工智能、机器学习、深度学习,到底他们哥仨是什么关系?

有三个词,这两年出现的频率越来越高:人工智能(AI),机器学习(ML),深度学习(DL),到底他们哥仨是什么关系?今天小编化繁为简,…

如何在 ASP.NET Core 中使用 HttpClientFactory ?

ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory。为什么要使用 HttpClientFactory 可以用 HttpClientFactory 来集中化管…

如何选择合适的损失函数,请看......

机器学习中的所有算法都依赖于最小化或最大化某一个函数,我们称之为“目标函数”。最小化的这组函数被称为“损失函数”。损失函数是衡量预测模型预测期望结果表现的指标。寻找函数最小值的最常用方法是“梯度下降”。把损失函数想象成起伏的山脉,梯度下…

OxyPlot.SkiaSharp中文显示乱码的问题

oxyplot 图表控件功能强大,使用很广泛。最近考虑到性能使用OxyPlot.SkiaSharp替代OxyPlot.WPF,曲线图表初步测试,性能提升近10倍左右。基于SkiaSharp图形引擎的一些控件常遇见中文乱码的问题,所以改用OxyPlot.SkiaSharp时也有心里…

想入门平均月薪2.58w人工智能领域?看看BAT的工程师在学什么

在这个贩卖焦虑的时代,职场人士和新晋父母成为了重点呵护对象,前有“摩拜同龄人”超越你,后有“月薪 3 万支撑不起的暑假班”等着你,而人工智能,又威胁要彻底抢走你的饭碗。京东无人分拣中心曝光,华尔街顶级…

.NET 6 Preview 3 发布

前言2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来自于底层,一起来看看都有什么新特性和改进吧。库改进新增值类型作为字典值时更快的处理方法.NET 6 Preview 3 引入了新的 unsafe API CollectionsMarshal.GetValueRef,这个 API 允许…

数据挖掘在生活上的应用

随着信息科技的进步,数据的收集变得十分便利。各式各样(手机、信用卡、浏览网页及部落格等)的信息,从不同的数据源,涌入我们预先设计好的数据仓储。这些信息透过数据挖掘的技术组合在一起,就可快速地勾勒出每个人对生活的品味、特…

Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step(二)

翻译自 Mohamad Lawand 2021年1月22日的文章 《Asp Net Core 5 Rest API Authentication with JWT Step by Step》 [1]在本文中,我将向您展示如何向我们的 Asp.Net Core REST API 添加 JWT 身份验证。我们将介绍的主题包含注册、登录功能以及如何使用 JWT (Json Web…

掌握这四点核心思想,统计学才算入门

在日常生活中,统计无处不在,比如最常见的问卷调查。实际上,统计学作为一门研究数据收集、整理与分析的学科,是能够帮助我们实现数据运用的终极目标(终极目标:洞悉本质、确定规律、预测未来)。但…

NET问答: Log4Net 无法将日志写入到 log 文件的求助.....

咨询区 john84&#xff1a;我在一个小项目中用上了 Log4Net&#xff0c;程序跑起来后没有任何日志写入到 log 文件&#xff0c;可能是我的 log appender 配的有问题&#xff0c;尴尬????&#xff0c;大家看看我这样配的有问题吗&#xff1f;web.config 完整的配置如下。<…

centos php.ini redis,CentOS下安装Redis及Redis的PHP扩展

1、安装Redis1.1 如果没有安装wget&#xff0c;安装wgetyum install wgetwget http://download.redis.io/releases/redis-3.2.0.tar.gz1.3 解压&#xff0c;并进入解压目录进行编译。编译成功后会在redis-3.2.0目录下生成相关文件$ tar xzf redis-3.2.0.tar.gz$ cd redis-3.2.0…

荐书 | 从启蒙到进阶,值得推荐的五本少儿编程

据小木对身边的人了解&#xff0c;好像码农们都有这么一个愿望&#xff1a;等我有孩子了&#xff0c;我一定教我的孩子学编程。玩游戏玩自己设计的才酷&#xff01;看着一个个码农爸爸憧憬着美好的愿景&#xff0c;小木恨不得马上帮他们实现这个愿望。这不~在了解了许多本儿童编…