C语言---插入排序(直接插入和希尔)

news2025/2/23 13:11:09

文章目录

  • 前言
  • 一、直接插入排序
    • 1.简介
    • 2.算法思路
    • 3.代码实现
  • 二、希尔排序
    • 1.简介
    • 2.算法思路
    • 3.代码实现


前言

插入排序一般分为两种,一种直接插入排序,另一种则是希尔排序

一、直接插入排序

1.简介

  直接插入排序是一种简单的排序方法,基本操作就是将需要排序的元素插入到已排好的有序表序列中,从而得到一个完整的序列。
  时间复杂度为:O(n²)    空间复杂度:O(1)      稳定性:稳定
  生活中最明显的例子就是,打扑克,把牌洗混,然后抓牌,以第一张为基础,然后将后面的牌依次插入,最后得到有顺序的牌面。

2.算法思路

  1. 待排的序列看作成2个部分,一部分为有序,另一部分为无序。
  2. 我们将第一个元素看作有序序列,第二个到最后都是无序序列。
  3. 将无序序列的每一个元素依次插入到有序序列的合适位置。在这里插入图片描述
    讲解:有一个待排序序列:【2,5,8,3】
    我们将第一个2看成已经排序好的序列,即有序序列,从第二个元素最后一个元素看作是无序序列。
    排序元素有序元素大,则插在有序元素后,反之,插在有序元素

3.代码实现

#include<stdio.h>
#define num 12
void insert_sort(int* a, int n)
{
	
	for (int i = 0; i < n - 1; ++i)
	{
		// 将x插入[0, end]有序区间
		int end = i;
		int x = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > x)
			{
				a[end + 1] = a[end];
				end--;
			}
			else break;
		}
		a[end + 1] = x;
	}
}
int main()
{
	int arr[num] = { 3,1,4,5,2,7,9,0,8,10,11,6 };
	printf("\n初始序列\n");
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
	insert_sort(arr, num);
	printf("\n排序后序列\n");
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
}

运行结果:
在这里插入图片描述

二、希尔排序

1.简介

希尔排序是在直接插入排序的基础上做了较大的改进,是将整个无序序列分割成若干个的子序列分别进行插入排序。
简单而言:将数组预排序,接近有序。
元素为逆排序时,时间复杂度最差为O(n²) 空间最差复杂度: O(n)
平均时间复杂度为O(nlog2n) 平均空间复杂度(O(1))
稳定性:差

2.算法思路

  1. 先取一个小于数组数的整数x作为第一个增量,把文件的全部记录分成x个组。
  2. 所有距离为x的倍数的值在同一组里,然后进行直接插入排序,变成有序序列。
  3. 取一个小于x的 x1 作为第二个增量,重复上述分组和排序,直到增量为1。
    注:当增量为1时,相当于所有记录放在同一组里进行直接插入排序

来自百度
假设有一组{70,30,40,10,80,20,90,100,75,60,45}无序序列

第一趟:增量gap为3时,即距离为3的元素放在一组,可以分成3组,分别是{70,10,90,60},{30,80,100,45},{40,20,75},按照直接插入排序对每个组进行排序。
第二趟:gap变成了2,接着和第一趟一样,最后也是按照直接插入排序对每个组进行排序。
第三趟:gap为1,后续操作也是如此…

3.代码实现

代码如下:

#include<stdio.h>
#define num 12
void ShellSort(int* a, int n)
{
	int gap = n;	
	while (gap > 1)
{
	gap = gap / 3 + 1; 
		for (int i = 0; i < gap; i++)
		{
			for (int j = i; j < n - gap; j += gap)
			{
				int end = j;
				int x = a[end + gap];
				while (end >= 0)
				{
					if (a[end] > x)
					{
						a[end + gap] = a[end];
						end -= gap;
					}
					else break;
				}
				a[end + gap] = x;
			}
		}
	}
}
int main()
{
	int arr[num] = { 3,1,4,5,2,7,9,0,8,10,11,6 };
	printf("初始序列:\n");
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
	ShellSort(arr, num);
	printf("\n排序后序列\n");
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
}

运行结果:
在这里插入图片描述

注:插入排序是排序的开始,各位努力学习的IT人员们,一起加油努力哦。祝各位学业有成,财源滚滚。
---------来自菜鸟TQ02的祝福语

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

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

相关文章

每天一道大厂SQL题【Day02】电商场景TopK统计

每天一道大厂SQL题【Day02】 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#xff0c;以每日1题…

数据包络分析DEA(数学建模)

一、模型背景数据包络分析是线性规划模型的应用之一&#xff0c;常被用来衡量拥有相同目标的运营单位的相对效率。数据包络分析是一种基于线性规划的用于评价同类型组织(或项目&#xff09;工作绩效相对有效性的特殊工具手段。这类组织例如学校、医院、银行的分支机构、超市的各…

Qt QRegExp正则表达式

Qt QRegExp正则表达式 前言一、正则表达式是什么?二、元字符是什么?三、 常用表达式四、 在QT中的用法总结前言 在用写程序的时候,往往会用到正则表达式,不仅仅是Web开发,MFC、GTK+、Qt开发的图形界面也是如此,只要了解其原理,语法也都大相径庭! 一、正则表达式是什么…

java ssm智慧校园校医室问诊系统 idea maven

基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现了智慧校园校医室问诊系统。系统主要包括个人中心、学生管理、校医管理、药品信息管理、校医科室管理、预检分诊管理、医生推荐管理、预约问诊管理、线上就诊管理、药方信息管理、药品购买管理、系统管理等功能模块。 通过…

nodejs+vue教师资格考前指导系统HTML5

前端&#xff1a;HTML5,CSS3、JavaScript、VUE 设计步骤如下&#xff1a; 1、明确系统的业务流程和数据流程&#xff0c;并用UML画出相应的活动图、顺序图。 2、设计数据字典&#xff0c;明确编码规则。 3、数据库进行设计&#xff0c;建立约束和联系。 4、创建程序框…

2022摄影摄像行业年度分析报告:单反小幅下滑,微单销额增长超32%

近年来&#xff0c;随着人们物质生活水平的提高&#xff0c;智能手机、数码相机等3C数码产品的普及率逐渐提高。人们需求的不断提升也拉动着整个产业产能的迅速增长&#xff0c;与此同时&#xff0c;产品的多样性和使用场景也在不断更新。 根据数据显示&#xff0c;2022年摄影摄…

什么是同理心?如何提高同理心?

有一句非常有名的话&#xff1a;“你永远也不可能真正了解一个人&#xff0c;除非你穿上他的鞋子走来走去&#xff0c;站在他的角度考虑问题。”这句话告诉我们&#xff0c;人与人是存在距离的&#xff0c;要想了解一个人必须要学会换位思考、有同理心。什么是同理心&#xff1…

大数据分析案例-基于随机森林算法构建新闻文本分类模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

LCHub:vika维格表将 70 万行代码开源了

vika维格表将 70 万行代码开源了 今天,vika维格表郑重宣布:我们将 70 万行代码开源了! 更为准确地说,我们正式发布了vika维格表的社区版——「APITable」。 这意味着,你可以通过免费开源的多维表格技术去创造更多有趣的事物。 当然了,你也许会问这个社区版、这些开源的代…

【PhD Debate - 14】将科幻照进现实——元宇宙数字人的当下与未来

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;2023年1月11日&#xff0c;PhD Debate-14特别邀请了来自上海交通大学博士生马子阳、香港科技大学博士生范杰森、埃因霍温理工大学博士生尹路、马里兰大学博士生乔怿凌、香港科技大学博士生徐昊作为嘉宾&#xff0c…

A、B、C三类IP地址范围有哪些?5张表格收藏好就够了!

大家好&#xff0c;这里是网络技术联盟站。 今天给大家带来的是子网范围的精品帖子&#xff0c;觉得文章对您有帮助的&#xff0c;不妨多多转发给您的朋友哦&#xff01; 每个章节我都会用表格进行汇总&#xff0c;可以保存收藏&#xff01; A类地址 /8 地址数&#xff1a…

嵌入式linux系统快速启动优化的方法

1、嵌入式设备的启动过程 (1)上电首先执行芯片内部固化的代码&#xff0c;这段代码会将BootLoader读取到芯片的iRAM中执行&#xff0c;初始化内存&#xff0c;并将BootLoader代码搬运到内存中继续运行&#xff1b; (2)BootLoader是启动引导代码&#xff0c;主要作用是将内核加载…

【二分查找】一文带你掌握二分法 (附万能模板)

目录一、简介二、易错点三、例子四、万能模板五、参考资料一、简介 哪怕没有学过编程的同学&#xff0c;也许不知道二分法这个名字&#xff0c;但也一定接触过它的核心思想。不了解的同学也没关系&#xff0c;我用一句话就能概括出它的精髓&#xff1a;将一个区间一分为二&…

注意力汇聚:Nadaraya-Watson 核回归

Nadaraya-Watson核回归是具有注意力机制的机器学习范例。 Nadaraya-Watson核回归的注意力汇聚是对训练数据中输出的加权平均。从注意力的角度来看&#xff0c;分配给每个值的注意力权重取决于将值所对应的键和查询作为输入的函数。 注意力汇聚可以分为非参数型和带参数型。 …

这5个Linux安全相关的命令,很实用!

1.ss ss更多人认为是“网络”命令&#xff0c;但该命令也可用于安全目的。 比如&#xff1a; ss&#xff1a;列出所有连接ss -a&#xff1a;列出侦听和非侦听端口ss -t&#xff1a;列出 TCP 连接 2.who who命令列出所有登录的人。 Linux 是多用户的&#xff0c;所以这个命…

VBA检查指定应用程序是否已经打开

VBA中提供了CreateObject和GetObject两种方法获得对象实例&#xff0c;二者的区别在于GetObject用于获取已经打开的应用程序对象&#xff0c;但是如果该应用程序并没有打开&#xff0c;那么将产生运行时错误&#xff0c;代码中需要加入额外的错误处理代码。 在任务管理器中可以…

第17讲:Python中元组的概念以及应用

文章目录1.元组的概念2.元组的基本使用2.1.定义一个元组2.2.定义一个空元组2.3.元组的元素是不可变的2.4.当元组中的元素是一个列表时列表中的元素可变2.5.当元组中只定义一个元素时的注意事项3.列表的所有操作同样适用于元组4.就是想修改元组中的某个元素1.元组的概念 Python…

CVE-2022-33980 Apache Commons Configuration 远程命令执行漏洞分析

漏洞描述 7月6日&#xff0c;Apache官方发布安全公告&#xff0c;修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞&#xff0c;漏洞编号&#xff1a;CVE-2022-33980&#xff0c;漏洞威胁等级&#xff1a;高危。恶意攻击者通过该漏洞&#xff0c;可在目标…

3. 其他数仓/BI架构解析

文章目录1. 独立数据集市架构2. 辐射状企业信息工厂Inmon架构范式建模维度建模3. 混合辐射状架构与Kimball架构目前&#xff0c;经过长时间的演进&#xff0c;各种数仓架构之间的区别变得越来越小&#xff0c;且不论哪种数仓架构&#xff0c;都会涉及维度建模。下面是几种常见的…

《项目管理精华》读书笔记

《项目管理精华》读后感 《项目管理精华》书中用实例讲解了项目管理的基本流程及一些项目管理技巧&#xff0c;通俗易懂且让人有读下去的欲望。本书按照项目管理的五大过程组的顺序逻辑加上一些作者认为项目管理中比较有价值的内容来介绍的&#xff0c;十大知识领域穿插在这些…