希尔排序—C语言实现

news2024/11/27 21:39:33

目录

前言

希尔排序

 发展历史

基本思想

时间复杂度

        🥰我们以一组数字来说操作说明:

gap的选取

 动图演示

 代码:

总结: 


前言

           🥰在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方法,下面我们来看一看希尔排序的特点与效率怎么样。😍

        🚩希尔排序是对直接插入排序的优化,在学习之前,没有学过插入排序的大佬们建议先学习插入排序:点这里跳转到插入排序🥰

希尔排序

        🍟希尔排序(Shell's Sort)是插入排序(插入排序-C语言实现_硕硕C语言的博客-CSDN博客)的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

⭕中文名 :希尔排序                       ⭕外文名:Shell's Sort

⭕别    名:缩小增量排序                 ⭕类    型:插入排序

⭕空间复杂度:O(1)                        ⭕稳定性:不稳定 

 发展历史

        🍟希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由希尔在 1959 年所发表的论文“A high-speed sorting procedure” 中所描述。希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

        🍟1961年,IBM 公司的女程序员 Marlene Metzner Norton(玛琳·梅茨纳·诺顿)首次使用FORTRAN语言编程实现了希尔排序算法。在其程序中使用了一种简易有效的方法设置希尔排序所需的增量序列:第一个增量取待排序记录个数的一半,然后逐次减半,最后一个增量为 1。

        🍟该算法后来被称为 Shell-Metzner 算法  ,Metzner 本人在2003年的一封电子邮件中说道:“我没有为这种算法做任何事,我的名字不应该出现在算法的名字中。”

基本思想

        🚩希尔排序是对插入排序的优化,基本思路是先选定一个整数作为增量,把待排序文件中的所有数据分组,以每个距离的等差数列为一组,对每一组进行排序,然后将增量缩小,继续分组排序,重复上述动作,直到增量缩小为1时,排序完正好有序。

​         🚩希尔排序原理是每一对分组进行排序后,整个数据就会更接近有序,当增量缩小为1时,就是插入排序,但是现在的数组非常接近有序,移动的数据很少,所以效率非常高,所以希尔排序又叫:缩小增量排序。

        🚨每次排序让数组接近有序的过程叫做预排序,最后一次插入是直接插入排序

时间复杂度

        🍪希尔排序的时间的时间复杂度为:O(n^{\frac{3}{2}} )希尔排序时间复杂度的下界是n*log2n。

        🥝希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n^{2})复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 

        🍔Shell算法的性能与所选取的分组长度序列有很大关系。只对特定的待排序记录序列,可以准确地估算关键词的比较次数和对象移动次数。想要弄清关键词比较次数和记录移动次数与增量选择之间的关系,并给出完整的数学分析,今仍然是数学难题。

🥰具体我们以一组数字来说操作说明:

 

       🔴 ​​​​​假设有一组{9, 1, 2, 5, 7, 4, 8, 6, 3, 5}无需序列。

第一趟排序:

        🥝设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。接下来,按照直接插入排序的方法对每个组进行排序。
第二趟排序
        🥝将上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为2组。按照直接插入排序的方法对每个组进行排序。
第三趟排序
        🥝再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为1的元素组成一组,即只有一组。按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。

        🚨注:需要注意一下的是,图中有两个相等数值的元素5和5。我们可以清楚的看到,在排序过程中,两个元素位置交换了。

gap的选取

        🍁希尔排序的效率取决于增量值gap的选取,时间复杂度并不是一个定值。开始时,gap取值较大,子序列中的元素较少,排序速度快,克服了直接插入排序的缺点;其次,gap值逐渐变小后,虽然子序列的元素逐渐变多,但大多元素已基本有序,所以继承了直接插入排序的优点,能以近线性的速度排好序。

        🍁步长的选择是希尔排序的重要部分,只要最终步长为1任何步长序列都可以工作。算法最开始以一定的步长进行排序,然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序。

        🍁最初的建议是折半再折半知道最后的步长为1<也就是插入排序>,虽然这样取可以比O(n2)类的算法(插入排序)更好,但这样仍然有减少平均时间和最差时间的余地。可能希尔排序最重要的地方在于当用较小步长排序后,以前用的较大步长仍然是有序的。比如, 如果一个数列以步长5进行了排序然后再以步长3进行排序,那么该数列不仅是以步长3有序,而且是以步长5有序。如果不是这样,那么算法在迭代过程中会打乱以前的顺序,那就不会以如此短的时间完成排序了。

        🍁最优的空间复杂度为开始元素已排序,则空间复杂度为 0;最差的空间复杂度为开始元素为逆排序,则空间复杂度为 O(N);平均的空间复杂度为O(1)希尔排序并不只是相邻元素的比较,有许多跳跃式的比较,难免会出现相同元素之间的相对位置发生变化。比如上面的例子中希尔排序中相等数据5就交换了位置,所以希尔排序是不稳定的算法。

 动图演示

排序算法:希尔排序_希尔排序最好时间复杂度-CSDN博客

 代码:

//希尔排序
void ShellSort(int a[], int n)
{
	// 1、gap > 1 预排序
	// 2、gap == 1 直接插入排序
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;    // +1可以保证最后一次一定是1
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

总结: 

        🍎希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能,交换不相邻的元素以对数组的局部进行排序,最终用插入排序将局部有序的数组排序。

        🍎希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:因子中除1外增量没有公因子,且最后一个增量因子必须为1。

        🍟后面硕硕也会整理一些快速排序,以及更快的排序方法,谢谢大家的观看。如果发现硕硕有什么错误的地方欢迎到评论区留言。一起加油吧🥰🥰🥰

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

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

相关文章

对应分析——SPSS实例分析

对应分析是R型因子分析和Q型因子分析的结合。本质是将列联表里面的频数数据作变换&#xff08;通过降维的方法&#xff09;以后&#xff0c;利用二维图的方式&#xff0c;简单直观的表示行变量和列变量之间的相关性&#xff0c;适合于多分类型变量的研究。数据展示如下&#xf…

20利用灰色神经网络预测6个月订单需求(附matlab程序)

1.简述 学习目标&#xff1a;灰色神经网络预测订单需求 灰色系统理论是一种研究少数据、贫信息、不确定性问题的新方法&#xff0c;它以部分信息已知&#xff0c;部分信息未知的“小样本”&#xff0c;“贫信息”不确定系统为研究对象&#xff0c;通过对“部分”已知信息的生成…

Web服务器群集:部署LNMP平台

目录 一、理论 1.LNMP平台 2.Nginx服务基础 3.Nginx访问控制 4.Nginx虚拟主机 二、实验 1.LNMP架构DISCUZ论坛应用 三、问题 1.没有规则可以创建“default”需要的目标“build”。 四、总结 一、理论 1.LNMP平台 &#xff08;1&#xff09;概念 LNMP平台是高效稳定的…

LinkedList(1):链表介绍和单向链表的实现

1 链表介绍 链表的分类&#xff1a;单链表&#xff0c;双链表&#xff0c;循环链表 链表&#xff1a;由链将一个个元素连接&#xff0c;每一个元素我们通常将其称之为Node 节点Node 节点&#xff1a;由两部分组成 数据值的变量 Node next 用来存放下一个节点的Node 对象 pack…

redis zrange 与 zrangebyscore的区别

redis zrange 与 zrangebyscore的区别 目录 redis zrange 与 zrangebyscore的区别前言先说概念上的结论&#xff1a;实验数据准备对比案例一对比结论&#xff1a;对比案例二对比结论&#xff1a; 总结 前言 想做一个在redis中获取数据时分页的功能&#xff0c;从网上查找到了z…

【C/C++数据结构与算法】C语言预处理

目录 一、源文件到可执行程序的过程 二、预处理详解 1. 预定义符号 2. #define 3. 条件编译 一、源文件到可执行程序的过程 预处理&#xff1a;去注释&#xff0c;宏替换&#xff0c;头文件展开&#xff0c;条件编译编译&#xff1a;c语言 ---> 汇编语言&#xff08;语…

软考高级系统架构设计师(二) 基础知识之计算机组成与系统结构

目录 概要 计算机组成结构 CPU组成 冯诺依曼结构 存储系统-层次化存储结构 高速缓冲存储器cache 主存编址计算 磁盘管理 磁盘管理算法 先来先服务&#xff08;FCFS&#xff09;&#xff1a; 最短寻道时间优先&#xff08;SSTF&#xff09; 扫描算法&#xff08;电梯调度…

【VisualStudio】使用 C++ 语言开发 Qt 环境配置教程

文章目录 1. 安装 Visual Studio2. 安装 Qt3. 联合Ref 先上一张效果图&#xff0c;具体步骤主要分为以下三步。 1. 安装 Visual Studio 这一步不再赘述&#xff0c;注意一定要安装 C 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 2. 安装 Qt 这一步也不再赘…

DAY10_HTTPTomcatServlet

目录 1 Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 2 HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示 2.3 响应数据格式2.3.1 格式介绍2.3.2 响应状态码2.3.2.1 状态码大…

vue+element-ui初体验入门拥有自己的前台项目以及配置文件讲解(2)组件式开发,路由,请求发送

阿丹&#xff1a; 前面的文章已经进行了vue的组件安装&#xff0c;本篇文章来了解一下vue的语句语法以及element-ui的具体用法。并使用全局的守卫路由来完成用户完成登录来请求头携带token 导入axios以及导入element-ui 按照图片指引来到main.js将我们前面文章下载的组件进行…

基于matlab将天线工具箱与相控阵系统配合使用(附源码)

一、前言 创建天线阵列&#xff08;如均匀线性阵列 &#xff08;ULA&#xff09;&#xff09;时&#xff0c;可以使用相控阵系统工具箱中内置的天线。或者&#xff0c;您可以使用天线工具箱天线。天线工具箱天线提供物理天线的真实模型。它们是使用力矩的方法设计的。相控阵天线…

自动化测试工具 AirTest 的使用方法与简介

目录 前言&#xff1a; Airtest简介 1.基于图像识别的Airtest框架 2.基于UI识别的Poco框架 Airtest环境搭建 Airtest布局 Airtest使用步骤 第一步&#xff1a;连接移动设备 第二步&#xff1a;创建一个.air文件&#xff08;也就是我们的测试脚本&#xff09; 第三步&#xff1a…

相机去畸变

1. 背景 在做图像感知工作过程中会遇到需要处理相机畸变的情况&#xff0c;如SLAM、3D重建等&#xff0c;则需要了解一些常见相机模型的成像过程&#xff0c;以及依据成像过程实现去除相机成像的畸变。 注意&#xff1a;这篇文章并不涉及太多相机参数畸变原理&#xff0c;更多…

Vicuna模型权重合成及模型部署

第一式&#xff1a;Vicuna模型部署 1.环境搭建1.1 构建虚拟环境1.2 安装FastChat1.2.1 利用pip直接安装1.2.2 从github下载repository然后安装 2.Vicuna Weights合成2.1 下载vicuna delta weights2.2 下载原始llama weights2.3 合成真正的working weights2.3 填坑手册 3. 使用命…

第九章 os模块

1. os模块介绍 os 模块是Python 内置的与操作系统中的文件系统相关的模块&#xff0c;该模块依赖于操作系统。通常情况下&#xff0c;如不特别指出&#xff0c;该模块提供的方法、属性在Windows 和UNIX 系统上都是可用的。其中&#xff0c;UNIX 系统包括Linux 和Mac OS X 说明…

软件加密类型及原理特点总结

目录 一、软件加密目的 二、加密方式介绍 2.1 硬件加密 2.2 软件加密 三、软件加密方式 3.1非对称加密算法 3.2对称加密算法 四、数字签名 五、软件破解方式 参考文献 一、软件加密目的 防止软件被复制使用并恶意破坏&#xff0c;给企业和个人带来经济损失。 二、加密方…

杂记 | 使用Docker和Nginx为网站添加HTTPS访问功能

文章目录 01 准备工作1.1 HTTPS介绍1.2 准备工作 02 编写nginx.conf03 使用docker启动nginx 01 准备工作 1.1 HTTPS介绍 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密通信保护网站数据传输的协议。它是 HTTP 协议的安全版本&#xff0c;通…

ROS下写服务

话题和服务的对比&#xff1a; 1.话题 话题是单向的&#xff0c;而且不需要等待服务端上线&#xff0c;直接发就行&#xff0c;数据的实时性比较高。 频率高&#xff0c;实时性强的传感器数据的传递一般使用话题实现。 话题通信是ROS中使用频率最高的一种通信模式&#xff0c…

人工智能之后,量子计算将成为下一趋势

光子盒研究院 人工智能显然是席卷科技行业的最新热潮&#xff0c;但一个更大的趋势可能即将到来&#xff0c;那就是量子计算——只要它能解决令人不安的网络安全问题。 量子计算的进展似乎注定要使今天的基于电子芯片的超级计算机逊色。这些机器在亚原子水平上工作&#xff0c;…

excel爬虫相关学习1:简单的excel爬虫

目录 1 什么是excel 爬虫 2 EXCEL爬虫 2.1 excel 爬虫的入口 2.2 需要配置的信息 2.2.1 如何获得 ua信息 2.3 获取的信息 2.3.1 获取信息的基本内容 2.3.2 获取过程 2.3.3 我们只用关注“表视图 ” 即可 2.4 EXCEL获得的爬虫数据 加载到excel里 2.5 数据到了excel表后…