插入排序-C语言版本

news2024/11/22 11:10:20

 前言

插入排序是很重要的排序,著名的希尔排序就是从插入排序演变过来的,所以我们需要并且很多时候有些面试也是会面试插入排序的,所以需要好好捋清楚插入排序的逻辑是什么

插入排序gif

插入排序单趟实现

1,插入排序我们需要假设最后一个数值也就是end+1是需要排序的,其他都是排序好的

2,把end+1这个下标的数值存放在tmp里面,并且和前面进行比较

3,如果遇见的元素比tmp大,我们继续往前移动进行比较,同时a[end]=a[end+1]往后覆盖

4,当遇见的是比tmp小的数值的时候,此时我们找到了tmp数值应该在的位置,进行插入

插入排序注意事项

这里需要注意的关键也是区间问题,假设数组有n个,那么end就是倒数第二个下标,end+1就是最后一个下标,是为了防止越界

我们需要小于n-1,因为,end=n-1;end+1=n,那么就越界了

所以在循环最大值里面,end=i=n-2,;end+1=n-1(最后一个数值)

插入排序代码的实现

//插入排序
void InsertionSort(int* a, int n)
{
	//多趟实现,这里n的截止条件-1,是因为下标从n-1就结束了,
	//不过我们需要小于n-1,因为,end=n-1;end+1=n,那么就越界了
	for (int i = 0; i < n - 1; i++)
	{
		//单趟实现
		int end = i; int tmp = a[end + 1];
		while (end >= 0)
		{
			//判断是不是比前一个数值小,小的话就往前走,不小的话停下来进行赋值
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else//找到了,此时跳出循环就可以
			{
				break;
			}
		}
		//这里是很多人会搞混乱的一点,
		//因为是找到了,所以end还没有继续移动,但是end+1+1的元素已经移动,所以end+1的位置是tmp应该出现的位置
		a[end + 1] = tmp;
	}
}

解释:

  1. 函数InsertionSort接受两个参数:一个指向整数数组a的指针和数组的长度n

  2. 外层循环从索引0遍历到n-1。每次迭代,i代表已排序部分的最后一个元素的索引。

  3. 在外层循环的每次迭代中,end变量被设置为当前索引i,表示当前考虑的元素的索引。tmp变量存储了a[i + 1]的值,这是未排序的第一个元素,也是我们准备插入到已排序部分的元素。

  4. 内层while循环用于在已排序部分从后向前扫描,找到tmp应该插入的位置。end变量随着比较逐步递减。

  5. while循环中,如果tmp小于当前比较的元素a[end],则将a[end]向后移动一个位置,为tmp腾出空间。

  6. 如果tmp大于或等于a[end],则while循环通过break语句结束,找到了tmp应该插入的位置。

  7. 循环结束后,将tmp赋值给a[end + 1],完成插入操作。

  8. 这个过程重复进行,直到数组中的所有元素都被扫描并插入到正确的位置。

代码逻辑:

  • 插入排序的基本思想是,对于数组中的每个元素,将其插入到前面已经排好序的子数组中的正确位置。
  • 初始时,认为数组的第一个元素是已排序的。然后,从第二个元素开始,逐个插入到前面的已排序序列中。
  • 每次插入操作都需要将元素与已排序序列中的元素进行比较,直到找到合适的插入点。

注意:

  • 这段代码在插入元素时,如果插入点是数组的开始,那么不需要进行任何移动操作,直接插入即可。
  • 代码中的end变量用于记录当前比较的元素在数组中的位置,而tmp变量用于暂存当前要插入的元素。
  • 插入排序是稳定的排序算法,因为它不会改变相等元素的相对顺序。

性能:

  • 插入排序的平均时间复杂度和最坏时间复杂度都是 𝑂(𝑛^2),其中 n 是数组的长度。
  • 插入排序的空间复杂度是 𝑂(1),因为它是原地排序算法,不需要额外的存储空间。

插入排序的时间复杂度

插入排序算法的时间复杂度取决于数组的初始顺序,具体如下:

  1. 最佳情况:如果输入数组已经是完全有序的,插入排序只需要进行 n 次比较(每次比较后插入一个元素到已排序部分),而不需要进行任何交换。在这种情况下,时间复杂度是O(n)。

  2. 平均情况:在平均情况下,插入排序的时间复杂度是 O(n^2)。这是因为每个元素都需要与已排序部分的多个元素进行比较,平均下来,每个元素需要比较n/2次。

  3. 最坏情况:如果输入数组是完全逆序的,插入排序需要进行n(n−1)​/2次比较和 n(n−1)​/2次交换,时间复杂度是 O(n^2)。

  4. 空间复杂度:插入排序是原地排序算法,它只需要一个额外的存储空间来暂存当前比较的元素,因此空间复杂度是 O(1)。

  5. 稳定性:插入排序是稳定的排序算法,它保持了相等元素的原始顺序。

时间复杂度的详细分析:

  • 插入排序通过构建有序序列来工作,对于未排序的数据,在已排序的序列中从后向前扫描,找到相应位置并插入。
  • 在每次迭代中,算法将当前元素与已排序序列中的元素逐一比较,找到合适的插入点。
  • 对于每个元素,比较操作可能需要进行 i 次(其中 𝑖i 是当前元素在数组中的位置),从第一个元素到最后一个元素,所需比较的总次数是递增的。

时间复杂度的数学表达式是:

总比较次数=1+2+3+…+(𝑛−1)=𝑛(𝑛−1)/2总比较次数

这表明插入排序的时间复杂度是 Θ(𝑛^2),尽管在最坏情况下时间复杂度较高,插入排序对于小规模数据集或部分有序的数据集来说是非常高效的。

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

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

相关文章

【高端精品】最新手机版微信小程序(拼多多+京东)全自动操作项目

现代互联网经济的发展带来了新型的盈利方式&#xff0c;通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;为商家带来增的流量&#xff0c;同时为使用者带来利润。这种盈利方式无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被系统自动收集。…

《现代通信原理与技术》码间串扰和​​​​​​​无码间串扰的眼图对比实验报告

实 验&#xff1a;码间串扰和无码间串扰的眼图对比实验报告 摘 要&#xff1a; 在数字通信系统中&#xff0c;码间串扰&#xff08;Inter-Symbol Interference, ISI&#xff09;是影响信号质量和系统性能的重要因素之一。本实验通过MATLAB软件生成并对比了受码间串扰影响和未…

记录一个flink跑kafka connector遇到的问题

【报错】 D:\Java\jdk1.8.0_231\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar56647:D:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\bin" -Dfile.encodingUTF-8 -classpath D:\Java\jdk1.8.0_231\jre\lib\cha…

ubuntu搭建java开发环境IDEA版

一.安装 OpenJDK 更新包列表&#xff1a; sudo apt update安装 OpenJDK&#xff1a; 你可以选择安装不同版本的 OpenJDK&#xff0c;例如 11 或 17&#xff0c;这个是安装 OpenJDK 11 的命令&#xff1a; sudo apt install openjdk-11-jdk验证安装&#xff1a; 安装完成后…

C++ 59 之 纯虚函数和抽象类

#include <iostream> #include <string> using namespace std;class Cal { // 类中有纯虚函数&#xff0c;这个类也叫做抽象类&#xff0c;无法实现实例化 public:int m_a;int m_b;// 虚函数// virtual int getRes(){// return 0;// }// 纯虚函数 作用和虚函数…

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进其在特定任务上的表现&#xff0c;而无需进行明确的编程。机器学习涉及多种算法和统计模型&#xff0c;它们可以从数据中学习规律&#xff0c;并做出预测或决策。机器学习的应用非常广泛&…

【Unity】如何做一个很平滑的行人动画,且可以根据行人速度动态调整动画速度?

首先我们定一下不同速度对应的行人动作状态&#xff0c;设计为四种状态&#xff1a; 静止站立Stand&#xff1a;0~maxStandSpeed走路Walk&#xff1a;minWalkSpeed~maxWalkSpeed慢跑Jog&#xff1a;minJogSpeed~maxJogSpeed快跑Run&#xff1a;大于MinRunSpeed 我们可以使用A…

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP&#xff0c;问我应该学ECC版本还是S4版本&#xff0c;我的建议如果你是自学的话&#xff0c;我个人建议使用ECC版本就行&#xff0c;因为这两个版本前台业务和后台配置的操作差异并不大&#xff0c;主要差异在于数据库的差异&#xff0c;前台业务操作和后台系统配…

用户态协议栈02-arp reply实现

在上一节DODK的UDP收发中发送udp包的时候&#xff0c;需要向物理机的arp表中添加一个静态的arp记录。这在生产环境中显然是不可以的。在内核的协议栈中&#xff0c;会将自己的ip和mac在局域网中进行广播&#xff0c;并且记录其他电脑的ip和mac。在需要发送数据包的时候&#xf…

6月15号作业

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0…

18. 《C语言》——【Nice2016年校招笔试题引发的思考】

亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&#xff0c;成为一名优…

证明 泊松分布 的期望和方差

泊松分布 泊松分布&#xff08;Poisson Distribution&#xff09;是描述在固定时间间隔内某事件发生次数的概率分布&#xff0c;特别适用于稀有事件的统计。假设随机变量 ( X ) 表示在时间间隔 ( t ) 内某事件发生的次数&#xff0c;并且该事件在单位时间内发生的平均次数为 (…

牛客练习题打卡(06-15)

run方法线程执行体 .start方法开启多线程 在java中 &#xff0c; 整数类型默认int,带小数默认double ; 如果要指定长整型加L&#xff1b;如果要指定为单精度加F ; 在java中&#xff0c;重载要求方法名相同&#xff0c; 参数列表必须不同&#xff08;个数不同、或类型不同、参数…

Oracle数据库Day03-单行函数

1. 单行函数 处理数据项接受函数并返回一个值对返回的每一行采取行动每行返回一个结果可能会修改数据类型可以嵌套接受可以是列或表达式的参数 function_name[(arg1, arg2,…)]

【面试干货】Class.forName()与ClassLoader.loadClass()在Java反射中的区别

【面试干货】Class.forName&#xff08;&#xff09;与ClassLoader.loadClass&#xff08;&#xff09; 在Java反射中的区别 1、Class.forName()1.1 示例代码1.2 关键点 2、ClassLoader.loadClass()2.1 示例代码2.2 关键点 3、两者之间的区别 &#x1f496;The Begin&#x1f…

主流框架选择:React、Angular、Vue的详细比较

目前前端小伙伴经常使用三种广泛使用的开发框架&#xff1a;React、Angular、Vue - 来设计网站 Reactjs&#xff1a;效率和多功能性而闻名 Angularjs&#xff1a;创建复杂的应用程序提供了完整的解决方案&#xff0c;紧凑且易于使用的框架 Vuejs&#xff1a;注重灵活性和可重用…

解决老毛子路由器自带微信提示功能无法触发问题

新买了一个二手的RM AC2100&#xff0c;刷了老毛子后&#xff0c;发现自带的上下线微信提示无法使用(方糖公众号无信息) 经我开启SSH&#xff0c;将上下线部分代码拿出来调试发现&#xff0c;发不出来的原因是原版信息发送长度过长&#xff0c;需要截取一部分才能发送成功。 …

查看npm版本异常,更新nvm版本解决问题

首先说说遇见的问题&#xff0c;基本上把nvm&#xff0c;npm的坑都排了一遍 nvm版本导致npm install报错 Unexpected token ‘.‘install和查看node版本都正确&#xff0c;结果查看npm版本时候报错 首先就是降低node版本… 可以说基本没用&#xff0c;如果要降低版本的话&…

比亚迪智驾技术震撼登场!L3级自动驾驶领跑全国,无图导航、夜间挑战轻松应对!

作为新能源汽车领域的翘楚&#xff0c;比亚迪在电池技术与智能驾驶方面都有着卓越的表现。近日&#xff0c;比亚迪凭借其领先的智驾技术&#xff0c;成功入选全国首批L3级自动驾驶上路及行驶试点名单&#xff0c;这无疑将推动智驾技术的普及速度。 你知道吗&#xff1f;比亚迪智…

Unity中的伽马(Gamma)空间和线性(Linear)空间

伽马空间定义&#xff1a;通常用于描述图像在存储和显示时的颜色空间。在伽马空间中&#xff0c;图像的保存通常经过伽马转换&#xff0c;使图片看起来更亮。 gamma并不是色彩空间&#xff0c;它其实只是如何对色彩进行采样的一种方式 为什么需要Gamma&#xff1a; 在游戏业…