[数据结构]——排序——插入排序

目录

​编辑

1 .插入排序

1.基本思想:

2.直接插入排序: 

 ​编辑

1.代码实现 

 2.直接插入排序的特性总结:

3.希尔排序( 缩小增量排序 )

 1.预排序

 2.预排序代码

3.希尔排序代码

4.希尔排序的特性总结:


1 .插入排序


1.基本思想:

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

 

2.直接插入排序: 

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

 

1.代码实现 

排序过程如下:

  1. 从数组的第二个元素开始,依次将其与前面的元素进行比较。
  2. 如果当前元素比前面的元素小,则将前面的元素后移一位。
  3. 继续比较前面的元素,直到遇到比当前元素小的元素,或者已经比较到数组的第一个元素。
  4. 将当前元素插入到空出来的位置上。
  5. 重复以上步骤,直到所有元素都被插入到合适的位置上。

实际上,这个排序算法的思想就是将数组分为已排序部分和未排序部分,每次从未排序部分选择一个元素并插入到已排序部分的合适位置上。

void InsertSort(int* a, int n)//直接插入排序
{
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int temp = a[end + 1];
		while (end >= 0)
		{
			if (temp <a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
				
		}
		a[end + 1] = temp;
	}
}

 2.直接插入排序的特性总结:

1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 稳定性:稳定

在实际应用中,如果待排序的数组已经基本有序,那么插入排序的效率会比较高。但是对于逆序数组或者随机排序的数组,插入排序的效率会比较低。因此,插入排序通常用于对小规模数据或者部分有序数据的排序。

3.希尔排序( 缩小增量排序 )


希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。 

 1.预排序

预排序是指在希尔排序之前,先将序列进行一次插入排序,将相隔一个增量的元素进行排序。这样可以将序列的一些小的逆序对提前消除,使得希尔排序的效率更高。

具体的希尔排序预排序的过程如下:

  1. 选择一个增量gap序列,通常取序列长度的一半作为初始增量。
  2. 根据增量gap将序列分成若干个分组,每个分组包含相邻的元素。
  3. 对每个分组进行插入排序,即将每个元素与其前面的元素进行比较并交换位置,直到该元素在该分组中的位置正确为止。
  4. 缩小增量,重复步骤2和步骤3,直至增量为1,即对整个序列进行一次插入排序。

 预排序是指在排序过程中,每次对分组进行插入排序之前,先对整个序列进行一次插入排序。这样做的目的是减少插入排序的比较和交换次数,从而提高排序效率。预排序的实现方法是在每次缩小增量时,将待排序序列进行一次插入排序。

 2.预排序代码

for(int j=0; j<gap ;j++)
{
for (int i = j; i < n - gap; i++)
	{
		int end = i;
		int temp = a[end + gap];
		while (end >= 0)
		{
			if (temp <a[end])
			{
				a[end + gap] = a[end];
				end-=gap;
			}
			else
			{
				break;
			}
				
		}
		a[end + gap] = temp;
	}
}

3.希尔排序代码

希尔排序的基本思想是将待排序序列分成若干个子序列,对每个子序列进行排序,然后逐步减小增量,最终整个序列就变成了有序序列。

具体的希尔排序过程如下:

  1. 初始化增量 gap = n / 3 + 1。
  2. 使用 gap 对序列进行分组,分为 gap 个子序列。
  3. 对每个子序列进行插入排序,即将每个元素与其前面的元素进行比较并交换位置,直到该元素在该子序列中的位置正确为止。
  4. 减小增量 gap,重复步骤2和步骤3,直至增量为1,即对整个序列进行一次插入排序。

希尔排序的特点是可以提前将较小的元素向前移动,从而减少后续插入排序的比较次数和交换次数,从而提高排序效率。

void ShellSort(int* a, int n)//希尔排序
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int temp = a[end + gap];
			while (end >= 0)
			{
				if (temp > a[end])
				{
					a[end + gap] = a[end];
					end-=gap;
				}
				else
				{
					break;
				}

			}
			a[end + gap] = temp;
		}
	}
}

4.希尔排序的特性总结:

1. 希尔排序是对直接插入排序的优化。
2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定;

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

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

相关文章

2023年全国消费金融财务数据挖掘-投资回报率最高的竟是!

作者Toby&#xff0c;来源公众号Python风控模型&#xff0c;2023年全国消费金融财务统计 大家好&#xff0c;Toby老师汇总了2023年全国消费金融财务数据。这份数据可以用来分析各个消费金融公司在2023年的财务表现&#xff0c;包括资产状况、营业收入、净利润以及投资回报率等…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

【自动化测试】使用MeterSphere进行接口测试

一、接口介绍二、接口测试的过程三、接口自动化测试执行自动化流程 四、接口之间的协议HTTP协议 五、 接口测试用例设计接口文档 六、使用MeterSphere创建接口测试创建接口定义设计接口测试用例 一、接口介绍 自动化测试按对象分为&#xff1a;单元测试、接口测试、UI测试等。…

一次违法网站的渗透经历

0x01 前言 在一次攻防演练中&#xff0c;我发现了一个有趣的渗透路径。在信息收集阶段&#xff0c;我注意到目标网站和用户资产网站共享相同的IP网段。这意味着它们可能在同一台服务器上托管&#xff0c;或者至少由同一家互联网服务提供商管理。这种情况为我们的渗透测试提供了…

路由重分布的概念与配置

路由重分布的概念 l 路由重分布是指连接不同路由域&#xff08;自治系统&#xff09;的边界路由器&#xff0c;它在路由协议之间交换和通告路由信息 从一种协议&#xff08;含静态/直连路由&#xff09;到另一种协议 同一种协议的多个实例 路由重分布的背景 网络出口位置…

几个局域网文件互传工具

推荐几个 局域网文件互传工具 一、 snapdrop https://snapdrop.net/ 两个设备都打开网页 网页会刷新出传送设备&#xff0c;点传送设备&#xff0c;选择文件&#xff0c;确定&#xff0c;另一个点下载 优点无需安装 二、 localsend https://github.com/localsend/locals…

C语言如何使⽤指针操作多维数组?

一、问题 如何使⽤指针操作多维数组呢&#xff1f; 二、解答 从⼆维数组的⻆度来看&#xff0c;a 是⼆维数组名&#xff0c;a 代表整个⼆维数组的⾸地址&#xff0c;也是⼆维数组 0 ⾏的⾸地址&#xff0c;等于1000。a1 代表第⼀⾏的⾸地址&#xff0c;等于1008。 如下图所示。…

【工具使用】神经网络训练高效可视乎库visdom | 使用方式 概念全梳理

我们知道深度学习训练过程中&#xff0c;非常重要的一部分是深度学习的可视乎 一般主流的是tensorboard 还有我在一个代码中看到了visdom&#xff0c;感觉非常Nice 想系统学习并了解一下相关内容 Visdom 是一个由 Facebook Research 开发的开源可视化工具&#xff0c;主要用…

【Java EE】总结12种锁策略以及synchronized的实现原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

C语言 | Leetcode C语言题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; /*1.将字符串原串与副本进行绑定成一个节点2.对字符串副本进行按ascii码表进行从小到大排序3.按照字符串进行比较排序4.合并 */ typedef struct Node{char*s;char*s_vice;int len; }Node;void sortShellChar(char*s,int len){for(int dista…

element-ui upload 组件 手动多次出发 submit

element 上传组件 upload 上传成功以后&#xff0c;想重新 调用 submit()函数&#xff0c;发现是不可以进行多次触发的,。 直接上解决方法&#xff0c;在上传成功后的钩子函数里添加:fileList[0l.status ready fileList是文件列表&#xff0c;status是单文件的状态改成ready就…

致力于为企业提升媒体宣传的一种新策略-软文发稿和投放

随着新媒体时代的快速发展&#xff0c;媒体宣发的方式也在不断迭代&#xff0c;其中&#xff0c;“软文发稿”成为了许多企业非常看重的一种媒体宣发方式。那么&#xff0c;什么是“软文发稿”呢&#xff1f;这是一种通过撰写有新闻属性的广告文章&#xff0c;将企业的品牌、产…

Oracle故障处理:ORA-00600错误处理思路

提前说明&#xff1a; 该故障&#xff0c;我只是旁观者。 但处理该故障的DBA工程师&#xff0c;思路很清晰&#xff0c;我非常受教&#xff01;在此也将经验分享。 目录 项目场景 问题分析 优化建议 项目场景 在某项目数据库运维群&#xff0c;有现场同事发了张报错截图如下…

密码学 | Schnorr 协议:零知识身份证明和数字签名

&#x1f955;原文&#xff1a; Schnorr 协议&#xff1a;零知识身份证明和数字签名 &#x1f955;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。文中的小写字母表示标量&#xff0c;大写字母表示椭圆曲线中的点。 1 Schnorr 简介 Schnorr 由德国数学家和密…

c++中的指针

一、指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一般采用16进制数字表示。可以利用指针变量保存地址。 二、指针变量的定义和使用 指针变量定义语法&#xff1a; 数据类型 * 变量名 #include<iostream> u…

电脑怎么压缩视频?3个角度6个方法教会你视频压缩~

电脑端压缩视频的方法有很多&#xff0c;比如使用专业的视频压缩软件&#xff0c;提供更多的功能和选项&#xff0c;可以根据用户的需求进行更精细的设置和调整。具有更高的处理能力和优化的算法&#xff0c;能够更快速地完成视频压缩任务&#xff1b;比如使用在线网站&#xf…

HCIP-Datacom-ARST必选题库_01_ACL【7道题】

一、单选 1.下面是一台路由器的部分配置,关于该配置描述正确的是&#xff1a; 源地址为1.1.1.1的数据包匹配第一条ACL语句rule 0,匹配规则为允许 源地址为1.1.1.3的数据包匹配第三条ACL语句rule 2,匹配规则为拒绝 源地址为1.1.1.4的数据包匹配第四条ACL语句rule 3,匹配规则为允…

AOC vs. DAC:哪个更适合您的网络需求?

在现代网络通信中&#xff0c;选择合适的连接线缆对于数据传输的稳定性和速度至关重要。两种常见的线缆类型是 AOC&#xff08;Active Optical Cable&#xff09; 和 DAC&#xff08;Direct Attach Cable&#xff09;。本文将详细介绍这两种线缆的特点、优势和适用场景&#xf…

想提高办公效率和质量的系统都有哪些?

我们这一波人是幸运的&#xff0c;从毕业后参加工作就开始接触到各种的办公软件&#xff0c;第一次让我觉得神奇且实用的就是office&#xff0c;可以根据场景进行不同的分类使用。 后来又有电子邮件、门户网站、聊天工具、财务软件、智能手机等不同的电子化工具陆续出现...而进…

实用的查询网站

1. 元器件网站 ALLDATASHEETCN.COM - 电子元件和半导体及其他半导体的数据表搜索网站。 热门电子元器件搜索 2. 聆思科技CSK6系芯片资料 CSK6 是聆思科技新一代的 AI 芯片 SoC 产品系列,采用多核异构架构,集成了 “星辰” ARM Star MCU、HiFi4 DSP以及聆思全新设计的 AI 神…