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

前言

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

正文

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,一经查实,立即删除!

相关文章

中小企业信息化,“轻”和“快”是方向

中小企业有着自身的特殊性,在观念改变和专业服务产品到位后,中小企业轻装上阵,实现高效办公、快捷管理、快速发展的愿望并不遥远。 时间刚过早上七点,韩信吃完早餐,便坐到沙发上看起了新闻,查看手机日历也是…

php 下拉表单,PHP表单和填充下拉列表问题

我正尝试连接到MySQL并将数据填充到Dropdown。这是我的代码。某些原因下拉列表没有被填充。请建议。这是代码。$mysqli_connection new mysqli($db_host, $db_username, $db_password, $db_database);if (isset($_POST[Submit_1])) {require submit.php;require validate.php;…

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

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

凭什么还不自信!!

前几天挺gbx说有个11级的小同学,已经在某OJ上刷过1000多道题,倍受打击!一度感叹为什么我没有早点起步,甚至一度认为ACM是给那些初高中做过NOI的同学准备的。 今天突发神经查了查神牛HH 的简历,真的很震撼: …

yml php,使用 docker-compose.yml 快速搭建php开发环境

1、新建一个文件夹,里面创建文件 docker-compose.yml2、编辑 docker-compose.yml 文件,保存以下内容# docker volume#docker run -d --name dbdata -h dbdata -v /wwwroot:/home/vagrant/wwwroot -v /Downloads:/home/vagrant/Downloads -v /wwwroot/web…

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

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

你知道WPF与WinForms的区别吗?

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

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

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

jodconverter水印java,OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)

java OpenOffice officetopdf最近项目需要实现下载Office文档时自动转成PDF文档,以下代码支持2003及2007版的Word,PPT,Excel转换,并支持自定义添加水印、页眉、页脚实现需要事先安装OpenOffice(我这里安装的是OpenOffice 4)OpenOffice 下载: …

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

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

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

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

windows下的NTP服务

近期的项目用到NTP,在使用的时候碰到一些问题,特记录如下: (1)NTP Server部分若要将内部时间服务器配置为与外部时间源同步,请按照下列步骤操作: 1. 将服务器类型更改为 NTP。为此&#xff0…

php判断是否是关联数组,php 关联数组判断是否为空

先看一个关联数组判断为空的代码,然后我们详细讲讲关于数据空的处理。$array array(0);if(empty($array)){echo "我空了 ";}else{echo "我不空啊 ";}$array[array]我是数组;print_r($array);$array[array1]我是数组1;print_r($array);unset($a…

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…

php框架快速入门,php-laravel4.0框架 简单快速入门

前提必须已经安装好了laravel4.0版本。写入权限:  安装完 Laravel ,你还需要为web服务器设置 app/storage目录的写入权限。目录结构:  安装完框架后,你需要熟悉一下该项目的目录结构。app 文件夹包含了一些如views &#xff0…

Filter+Redis解决项目之间调用的幂等性

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同在项目远程调用中,如果接口调用失败或者是超时,客户端都会…

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

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

一起谈.NET技术,也玩MVC3.0 Razor自定义视图引擎来修改默认的Views目录结构

刚刚爱上MVC3.0,几个不眠夜的学习越来越有趣。今天随手尝试自定义Mvc3.0的视图引擎,虽然已成功,但是还发现有点小疑问。随手贴出来希望大家指教指教。 MVC的视图文件目录被固定/Views目录内,区域视图文件也是被固定在/Areas目录下…

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

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