【排序算法】插入排序(希尔排序)

目录

一.直接插入排序

1.基本思想

 2.实现

3.特性

1.效率

2.时间复杂度:O(N^2)

3.空间复杂度:O(1)

4.稳定性:稳定

二.希尔排序

1.基本思想

2.实现

3.特性

1.效率

2.时间复杂度:O(N^1.3)

​编辑

3.空间复杂度:O(1)

4.稳定性:不稳定


一.直接插入排序

1.基本思想

直接插入排序是一种简单的插入排序法,其核心思想是对一个已经有序的序列插入一个数据,该数据依次比较有序序列中的值,直到插入到合适的位置。在我们玩扑克牌整理牌序的时候,用到的就是直接插入排序的思想。

 2.实现

直接插入排序的实现原理如下动图所示:

如上图所示,插入排序的前提是在一个已经有序的序列中进行插入,那么不妨假设在闭区间[0,end]中是有序的,那么插入元素在下标为end+1(用tmp存储)的位置开始插入,end+1和end的值进行比较,假设此时排升序,那么一旦end+1的值小于end,那么end的值就要向后移动,使end+1的值变为end就可(这里解释了为什么要用tmp存储end+1处的值,一旦被end替代,end+1的值就找不到了),当然,变换后end需要减1进行对下一个位置的比较,直到与0下标位置进行比较(此时end = 0)若不满足小于那么停止循环,直接在end+1的地方放置tmp即可。

值得注意的是,放置end+1为tmp必须要在循环外进行,这是由于边界问题,如下图所示插入2的情况:

void InsertSort(int* arr, int n)
{
	//[0,end]有序,end+1是插入值下标
	//最后一个插入的值下标为n-1,即end+1=n-1,end=n-2
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int tmp = arr[end + 1];
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
	}
}

3.特性

1.效率

元素越接近有序,直接插入排序算法的时间效率就越高,完全是逆序时效率最低

2.时间复杂度:O(N^2)

最好情况下序列为顺序,每个end+1只需要与前一个判断即可,此时时间复杂度为O(N)

最坏情况下序列为逆序,此时每个end+1都要换到下标为0为止,此时时间复杂度为O(N^2)

3.空间复杂度:O(1)

直接插入排序没有额外的空间开销,因此空间复杂度为O(1)

4.稳定性:稳定

二.希尔排序

1.基本思想

根据直接插入排序元素越接近有序,直接插入排序算法的时间效率就越高 的特性,希尔排序运营而生,希尔排序的核心思想就是优化直接插入排序,先对序列进行预排序,将逆序的状态破坏,达到一定的有序程度再进行直接插入排序,这就是希尔排序。

2.实现

定义gap(间隔)为一个具体的数,图中为3,那么整个序列将被分为gap组,分别对每组进行直接插入排序,就如图中黄红绿代表的三组一样,如此就能将一个“较为逆序”的序列变为“较为有序”,就像9这个最大的数一下就换到了最后一个位置,这样再进行插入排序,效率就会大大提高。

 其中对一组的插入排序写起来十分简单,只需要将直接插入排序的减1的操作改为减gap,加1改为gap即可,也就是说是上文插入排序的推广情况。然后再套上一个gap组的循环,就能实现预排序,注意要将第二层循环内改为i = j,不要只加个外层循环就完了。

void SheerSort(int* arr, int n)
{
	int gap = 3;

	//总共有gap组,每组都进行插入排序
	//注意i = j,每组的开始不同
	for (int j = 0; j < gap; j++)
	{
		//一组的插入排序
		//注意end+gap是插入值下标,i<n-gap
		for (int i = j; i < n - gap; i += gap)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if (tmp < arr[end])
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}
	
	//最后进行直接插入排序
	InsertSort(arr, n);
}

当然也可以直接多组排序同时进行,这样就少套了一层循环,但执行的总次数和上述代码是相同的,也就是说效率依然是相同的。该循环直接从第一个数到下标为n-gap-1的值,该下标+gap即是最后一个值。 

void SheerSort(int* arr, int n)
{
	int gap = 3;

	//多组同时进行
	for (int i = 0; i < n - gap; i++)
	{
		int end = i;
		int tmp = arr[end + gap];
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + gap] = arr[end];
				end -= gap;
			}
			else
			{
				break;
			}
		}
		arr[end + gap] = tmp;
	}


	//最后进行直接插入排序
	InsertSort(arr, n);
}

3.特性

1.效率

希尔排序是对直接插入排序的优化,当gap>1时就是预排序,目的是让数组更接近有序的状态,从而方便gap=1时的直接插入排序,提高效率。其中gap的取值方法有很多,但没有人证明哪种取值方法效率最高,以下出自《数据结构-用面相对象方法与C++描述》--- 殷人昆

2.时间复杂度:O(N^1.3)

由于gap取值不同,时间复杂度也不相同,但可以大概估算个平均结果是O(N^1.3)

以下内容出自《数据结构(C语言版)》--- 严蔚敏

3.空间复杂度:O(1)

希尔排序没有额外的空间开销,因此空间复杂度为O(1)

4.稳定性:不稳定

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《植物大战僵尸杂交版》2.2:新版本体验与下载指南

作为《植物大战僵尸》系列的忠实粉丝&#xff0c;我最近发现了一款令人兴奋的改版游戏——《植物大战僵尸杂交版》2.2。这款游戏不仅保留了原作的经典元素&#xff0c;还加入了一些创新的玩法&#xff0c;让我忍不住想要分享给大家。 2.2版本新体验 新僵尸登场 最新版本中&am…

vue3 - vue项目自动检测更新

GitHub Demo 地址 在线预览 web项目当页面检测到需要更新&#xff0c;然后弹框提示是否更新&#xff08;刷新页面&#xff09;这种可以通过纯前端实现也可以通过接口实现 接口实现&#xff1a;通过调用接口轮询和本地的版本号比较&#xff0c;检查是否需要弹框提示更新纯前端实…

移动应用稳定性测试

移动应用稳定性测试 使用Monkey等工具进行移动应用稳定性测试是一种常见的自动化测试方法。Monkey工具可以自动生成各种随机事件来模拟用户操作&#xff0c;从而测试应用在不同情况下的表现。在执行monkey命令后&#xff0c;主要观察以下的结果信息来评估移动应用的稳定性。 崩…

【PyQt】

PyQT5线程基础&#xff08;2&#xff09; 线程案例案例一案例二 线程案例 案例一 案例一代码通过线程实现点击按钮向线程传输地址&#xff0c;程序等待20秒后&#xff0c;返回结果。 通过QtDesigner创建如下图所示的界面ui&#xff0c;并用UIC工具转成对应的py文件。 main文…

作业一:ER图 作业:二QQ项目思路 作业三:实现QQ的登录与注册界面

一、ER图 二、QQ项目思路&#xff1a;客户端功能&#xff0c;服务器端功能的实现 1.登录注册&#xff1a; 将基本信息如手机号码&#xff0c;验证码&#xff0c;还有已有的账号及账号相关信息等存入数据库中&#xff0c;登录方式为账号密码登录&#xff0c;还有忘记密码用邮箱…

深度学习DeepLearning多元线性回归 学习笔记

文章目录 多维特征变量与术语公式多元线性回归正规方程法Mean normalizationZ-score normalization设置合适的学习率Feature engineering 多维特征 变量与术语 列属性xj属性数n x ⃗ \vec{x} x (i)行向量某个值 x ⃗ j i \vec{x}_j^i x ji​上行下列均值μ标准化标准差σsigm…

为什么渲染农场渲染的是帧,而不是视频?

在3D动画产业的壮阔画卷中&#xff0c;渲染农场作为幕后英雄&#xff0c;以其庞大的计算能力支撑起无数视觉奇观的诞生。这些由高性能计算机集群构成的系统&#xff0c;通过独特的逐帧渲染策略&#xff0c;解锁了单机难以企及的创作自由与效率。本文将深入剖析这一策略背后的逻…

odoo 自定义菜单模型等进行报表输出

由于个性化需求&#xff0c;要定义不同报表不同条件搜索&#xff0c; 所以自定义有如下&#xff1a; 模型字段权限菜单 功能如下&#xff1a; 启用&#xff1a;创建新菜单、form视图、action动作 前提&#xff1a;模型已经创建好&#xff0c; 禁用&#xff1a;对菜单进行归档…

PMP–计算--图示

文章目录 概念基准绩效预测 公式 概念 基准绩效 最常见的基准是成本和进度。跟踪范围或技术基准的项目可以使用可交付物测量指标中的信息。 大多数进度测量指标会根据以下相关的计划绩效来跟踪实际绩效&#xff1a; ▶ 开始日期和完成日期。将实际开始日期与计划开始日期进行…

基于术语词典干预的机器翻译挑战赛笔记Task1 跑通baseline

#AI夏令营 #Datawhale #夏令营 Step1&#xff1a;报名赛事&#xff01;(点击即可跳转) 赛事链接&#xff1a;https://challenge.xfyun.cn/h5/detail?typerole-element-extraction&chdw24_y0SCtdhttps://challenge.xfyun.cn/topic/info?typemachine-translation-2024&…

【Linux杂货铺】2.进程优先级

1.进程优先级基本概念 进程优先级是操作系统中用于确定进程调度顺序的一个指标。每个进程都会被分配一个优先级&#xff0c;优先级较高的进程会在调度时优先被执行。进程优先级的设定通常根据进程的重要性、紧急程度、资源需求等因素来确定。操作系统会根据进程的优先级来决定进…

如何评估媒体邀约宣传的效果

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 评估媒体邀约宣传的效果是一个系统而全面的过程&#xff0c;它涉及多个维度的考量和分析。 一、受邀媒体的出席率&#xff1a; 1.受邀媒体出席率直观反映了媒体邀约的效果&#xff1b; …

基于SpringBoot+MySQL的租房项目+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

LLM-阿里云 DashVector + ModelScope 多模态向量化实时文本搜图实战总结

文章目录 前言步骤图片数据Embedding入库文本检索 完整代码 前言 本文使用阿里云的向量检索服务&#xff08;DashVector&#xff09;&#xff0c;结合 ONE-PEACE多模态模型&#xff0c;构建实时的“文本搜图片”的多模态检索能力。整体流程如下&#xff1a; 多模态数据Embedd…

Camera Raw:蒙版 - 选择主体、天空、背景、对象、人物

Camera Raw “蒙版”模块提供了五种基于 AI 技术自动选择并创建蒙版的方法&#xff0c;帮助用户更高效地进行选择和调整特定照片区域。 它们是&#xff1a;选择主体、选择天空、选择背景、选择对象以及选择人物。 ◆ ◆ ◆ 选择主体 Select Subject 基于 AI 技术自动分析并选…

昇思25天学习打卡营第1天|初步了解

1在昇思平台上申请过相关资源之后&#xff0c;将示例代码粘贴到输入框内。可以在下图中创建一个新的文档。 2不过初次运行的时候会遇到一个问题&#xff0c;点击运行的时候会出现新的输入框&#xff0c;而不是直接运行。遇到此问题等待就可以了&#xff0c;或者稍微等一下再运…

在分布式环境中,怎样保证 PostgreSQL 数据的一致性和完整性?

文章目录 在分布式环境中保证 PostgreSQL 数据的一致性和完整性一、数据一致性和完整性的重要性二、分布式环境对数据一致性和完整性的挑战&#xff08;一&#xff09;网络延迟和故障&#xff08;二&#xff09;并发操作&#xff08;三&#xff09;数据分区和复制 三、保证 Pos…

PHP智慧社区小区物业管理系统小程序源码

让生活更便捷&#xff0c;社区更和谐✨ &#x1f3e1;【开篇&#xff1a;智慧生活&#xff0c;从社区开始】&#x1f3e1; 在快节奏的现代生活中&#xff0c;寻找一份便捷与舒适成为了我们共同的追求。小区&#xff0c;作为我们日常生活的温馨港湾&#xff0c;其管理水平和服…

软件供应链安全:如何防范潜在的攻击?

来源&#xff1a;https://thehackernews.com/2024/06/practical-guidance-for-securing-your.html 软件生产组织面临越来越大的监管和法律压力&#xff0c;要求其保护供应链并确保软件的完整性&#xff0c;这不足为奇。在过去几年里&#xff0c;软件供应链已经成为攻击者越来越…

JupyterNotebook中导出当前环境,并存储为requirements.txt

​使用Anaconda管理Python环境时&#xff0c;可以轻松地导出环境配置&#xff0c;以便在其他机器或环境中重新创建相同的环境。可以通过生成一个environment.yml文件实现的&#xff0c;该文件包含了环境中安装的所有包及其版本。但是&#xff0c;常常在一些课程中JupyterNotebo…