【数据结构】排序算法系列——希尔排序(附源码+图解)

news2024/11/14 13:35:43

希尔排序

算法思想

希尔排序(Shell Sort)是一种改进的插入排序算法,希尔排序的创造者Donald Shell想出了这个极具创造力的改进。其时间复杂度取决于步长序列(gap)的选择。我们在插入排序中,会发现是对整体数据直接进行了统一的插入排序,每个数据之间的间隙是1,这里的1指的就是步长序列gap。在希尔排序中,我们会将整体数据一分为多份,进行散布式的插入排序,这时候每一个子序列之间的间隙就是gap——那么事实上我们也可以将插入排序就看成是gap=1的希尔排序。

我们来具体分析希尔排序的算法步骤:

  • 将待排序序列分为若干个序列,每个序列的间距n(gap)需要相同
  • 将这些子序列分别进行插入排序
  • 不断减小这个间距

那么我们减小这个间距的目的是什么呢?

gap > 1时我们可以称为预排序,目的是让数组更接近于有序。当gap = 1时,数组已经接近有序的了,就整体而言,最后一次整体的插入排序就可以大大提高效率——我们从插入排序的时间复杂度分析也可以看出,越接近有序,插入排序的效率就越高,从而可以达到优化的效果。

图解

图片来源于网络

可以看到每次减小gap的规律是将原先的gap/2,但事实上这只是其中一种处理方法,并不说明这是最优解。

C语言代码分析

//与插入排序类似,只是插入排序的间隔是1,而希尔排序的间隔是gap

//第一种思想:依次排序
//排完一组后,再排下一组
void ShellSort1(int arr[], int n)
{
	int gap = 3;//任意一个想要的间隔
	for (int j; j < gap; j++)
	{
		for (int i = gap; i < n; i += gap)
		{

			int end = i - gap;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if (tmp >= arr[end])
				{
					arr[end + gap] = tmp;
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}


}

//第二种思想:多组并排
void ShellSort2(int arr[], int n)
{
	int gap = 3;//任意一个想要的间隔
	
		for (int i = gap; i < n-gap; i ++)
		{

			int end = i;
			int tmp = arr[i + gap];
			while (end >= 0)
			{
				if (tmp >= arr[end])
				{
					arr[end + gap] = tmp;
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
}

//gap越大,跳得越快,但一次排下来最无序
//gap越小,跳得越慢,但一次排下来更有序

注意

希尔排序实际上是个相当复杂的排序算法,这主要是跟它的步长序列gap到底该如何取、后续应该减小有关。这其中涉及到很多的数学分析以及数学公式,我们可以参考严蔚敏老师的解读:

在这里插入图片描述

以及殷人昆老师:

在这里插入图片描述

所以,本篇文章仅对其基本的算法思想和代码编写进行解析,如有兴趣深究希尔排序,各位读者们可以自行上网搜索有关知识~

时间复杂度

一般情况下,希尔排序的时间复杂度可以表示为:

  • 最好情况(已排序的情况):O(n log n)
  • 平均情况:取决于步长序列的选择,通常为**O(n1.3)-O(n2)**之间。
  • 最坏情况:O(n2)

希尔排序通过逐步减少步长来实现排序,初始的大步长使得数组元素可以较快地达到部分有序状态,最终通过小步长的插入排序完成排序。所以时间复杂度的具体分析也就取决于步长序列。

这里针对平均情况,我们进行一下简单的具体分析:

希尔排序的平均情况时间复杂度是比较复杂的。在实际应用中,常见的步长序列如希尔建议的序列(1, 3, 7, …, 2^k-1)或者Hibbard序列(1, 3, 7, 15, …, 2k-1)等,它们的时间复杂度通常就在**O(n1.3)-O(n2)**之间,这是经过数学算出来的结果。这些序列被设计为逐渐减小,从而在较早阶段快速减少逆序对的数量,然后在最后阶段完成排序。

总体来说,希尔排序的性能高度依赖于步长序列的选择。良好的步长序列可以显著改善排序的效率,使得平均情况下的时间复杂度能够在O(n^1.3)左右,而不好的选择则可能导致接近最坏情况的性能。

稳定性

鉴于希尔排序会改变前后元素的相对位置,所以:不稳定

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

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

相关文章

开源 AI 智能名片 S2B2C 商城系统在人仓合一平台招募社区合伙人模式中的应用与价值

摘要&#xff1a;本文主要探讨人仓合一平台招募社区合伙人的模式&#xff0c;分析其对流量整合与变现的意义。重点阐述开源 AI 智能名片 S2B2C 商城系统在该模式中的应用&#xff0c;包括如何助力合伙人盘活微信群流量、整合客户资源、实现商品信息推广以及推动流量变现&#x…

从传统编程到低代码,企业如何以更低成本、更快速度交付项目,推动年收入增长

在这数字化转型的大潮中&#xff0c;商业环境也发生着巨大的变化&#xff0c;企业对于项目交付的速度、质量和成本控制都有着越来越高的要求。传统编程模式的门槛高、开发周期长&#xff0c;各方面的成本算下来&#xff0c;成为企业快速发展的瓶颈。低代码开发的兴起&#xff0…

AcWing算法基础课-788逆序对的数量-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》788 题——逆序对的数量。本文详细讲解了如何通过归并排序算法高效计算数组中的逆序对数量。通过递归分治和归并过程&#xff0c;我们不仅实现了数组的排序&#xff0c;还在排序过程中巧妙地计…

【深度学习】【图像分类】【OnnxRuntime】【C++】ResNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署前言模型转换--pytorch转onnxWindows平台搭建依赖环境ONNXRuntime推…

这种钛镍合金不简单!强度高且模量低,制造过程也不难

大家好&#xff0c;今天我们要来聊聊一种神奇的合金——《A polymer-like ultrahigh-strength metal alloy》发表于《Nature》。在许多新兴技术中&#xff0c;比如变形飞机和超人型人工肌肉&#xff0c;都需要一种既强又灵活的金属合金。但长久以来&#xff0c;要实现这种“强而…

电商品牌假货要怎么处理

在电商蓬勃发展的今日&#xff0c;假货问题如影随形&#xff0c;严重威胁着品牌的声誉与市场的健康。力维网络以专业打假服务&#xff0c;为品牌保驾护航。 一、精准监测&#xff0c;揪出假货端倪 力维网络的数据监测系统犹如一张严密的大网&#xff0c;覆盖全网。通过全面采集…

828华为云征文 | 华为云Flexus X实例上实现Docker容器的实时监控与可视化分析

前言 华为云Flexus X&#xff0c;以顶尖算力与智能调度&#xff0c;引领Docker容器管理新风尚。828企业上云节之际&#xff0c;Flexus X携手前沿技术&#xff0c;实现容器运行的实时监控与数据可视化&#xff0c;让管理变得直观高效。无论是性能瓶颈的精准定位&#xff0c;还是…

揭晓2024年上半年热门跨境电商平台排行榜完整版,排在第二的居然是它!

随着全球电商市场的持续发展和融合&#xff0c;跨境电商平台已成为众多商家拓展国际市场的重要渠道。面对琳琅满目的平台选择&#xff0c;卖家如何做出明智的决策&#xff0c;成为了关注的焦点。本文将从今年上半年GMV这个维度来盘点一下热门电商平台的最新排行榜&#xff0c;有…

qwen2 VL 多模态图文模型;图像、视频使用案例

参考&#xff1a; https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct 模型&#xff1a; export HF_ENDPOINThttps://hf-mirror.comhuggingface-cli download --resume-download --local-dir-use-symlinks False Qwen/Qwen2-VL-2B-Instruct --local-dir qwen2-vl安装&#x…

你不得不知的日志级别

前言 写日志是一项具有挑战性的任务&#xff0c;在工作中我们常常面临一些困境&#xff0c;比如&#xff1a; 开发人员在编写代码时常常陷入纠结&#xff0c;不确定在何处打印日志才是最有意义的&#xff1b;SRE人员在调查生产问题时可能因为缺乏必要的日志信息而束手无策&am…

基于SSM的“高校学生社团管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“高校学生社团管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统结构图 首页 注册 登录 后台首页界面 社团公告页面 留…

Engage2024用户大会成功举办,数聚股份携手销售易共绘数字化转型新篇章

2024年9月5日&#xff0c;销售易第六届用户大会Engage2024在上海盛大举行。销售易&#xff0c;作为唯一一家入选Gartner SFA魔力象限、且产品能力全球前四的国产CRM软件&#xff0c;当之无愧是国产CRM软件的龙头&#xff0c;其用户大会自然就是CRM领域盛会&#xff0c;汇聚了众…

生命周期函数

所有继承MonoBehavior的脚本 最终都会挂载到Gameobiject游戏对象上 1.生命周期西数 就是该脚本对象依附的Gameobject对象从出生到消亡整个生命周期中 会通过反射自动调用的一些特殊函数 2.Unity帮助我们记录了一个Gameobject对象依附了哪些脚本 会自动的得到这些对象&#x…

视频监控系统中的云镜控制PTZ详细介绍,以及视频监控接入联网平台相关协议对PTZ的支持

目录 一、PTZ概述 二、PTZ 控制的应用场景 1、公共场所 2、安全监控 3、交通监控 4、工业生产环境中的质量监控 5、大型活动的现场直播或录制 三、PTZ摄像的优缺点 1、优点 2、缺点 四、PTZ控制的基本原理 1、云台控制 2、镜头控制 五、 PTZ 控制协议 1. Pelco-…

深度学习时遇到tensor([0.], device=‘cuda:0‘)等输出

更改了数据集后进行训练遇到了以下输出&#xff0c;精度正常提升&#xff0c;训练正常&#xff0c;就是精度和map之间又很多输出&#xff0c;如下&#xff1a; tensor([0.], devicecuda:0), tensor([0.], devicecuda:0), tensor([0.], devicecuda:0), tensor([0.], devicecuda…

NAT技术+代理服务器+内网穿透

NAT技术 IPv4协议中&#xff0c;会存在IP地址数量不充足的问题&#xff0c;所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的&#xff0c;而公网中的IP地址都是唯一的&#xff0c;所以NAT&#xff08;Network Address Translation&…

往复密封问题的两个问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

使用ChatGPT高质量撰写文献综述全攻略实操指南,五步轻松搞定!

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。 在学术研究中,文献综述很重要,但…

无线感知会议系列【2】【智能无感感知 特征,算法,数据集】

前言&#xff1a; 这篇来自 2022 泛在可信智能感知 论坛 作者&#xff1a; 清华大学杨铮教授 视频&#xff1a; 2.智能无线感知&#xff1a;特征、算法、数据集&#xff1b; 杨峥 清华大学 副教授_哔哩哔哩_bilibili 这篇论文前面有讲过,我前面的博客也有基于提供的数据集做了…

关于打不开SOAMANAGER如何解决

参考文章&#xff1a;https://blog.csdn.net/yannickdann/article/details/115396035 打开SE93