常见排序算法之插入排序

目录

一、直接插入排序

1.1 什么是插入排序

1.2 代码思路

1.3 C语言源码

二、希尔排序

2.0 插入排序的弊端

2.1 什么是希尔排序?

2.2 排序思路

2.3 C语言源码


一、直接插入排序

1.1 什么是插入排序

插入排序是一种简单直观的排序算法,它通过构建有序序列,对未排序数据逐个插入到合适的位置,从而达到排序的目的。

具体操作为:将第一个元素视为已排序部分,然后依次将后面的元素插入到已排序部分,直到所有元素都插入完成为止。

插入排序的时间复杂度为O(N^2),是一种稳定的排序算法。

1.2 代码思路

采取先部分后整体的思路进行讲解

  • 部分
  1. 假设前n个元素均为已排序好的元素,已排序好的最后一个元素的数组下标为end
  2. 将end+1下标对应的值与end对应的值进行比较
    如果大于前一个值,则在end+1的位置插入该值。
    如果小于前一个值,则在end-1的位置插入该值。
  3. 循环比较已经排序好的元素的值与end+1的值,重复插入操作。
    在比较有限次后若发现满足条件,则跳出循环。
    考虑最坏的情况,如果end-1为0时,也就是插入到了数组的第一个位置,则跳出循环。
  • 整体
  1. 从n=0开始循环,假设循环i次,那么每次已排序好的数组最后一个下标就是数组的大小-i
  2. 关键问题是要进行多少次循环?

1.3 C语言源码

void InsertSort(int* a, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{

			if (a[end] > a[end + 1])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
			a[end + 1] = tmp;
		}
	}
}

二、希尔排序

2.0 插入排序的弊端

插入排序的主要弊端在于其时间复杂度较高。在最坏情况下,插入排序的时间复杂度为O(n^2),因此对于大规模数据集合来说,插入排序的效率较低。尤其是当数组是升序排序时,想要转成降序排序,效率极低。

由此衍生出希尔排序。通过引入增量序列,将整个数据集合分成多个子序列,并对每个子序列进行插入排序,逐渐减小增量,最终实现对整个数据集合的排序。这样做减少了数据的搬移次数,提高了排序的效率。希尔排序通过这种分组的方式,使得较小的元素可以更快地移动到合适的位置,从而减少了插入排序中的反复比较和移动操作,提高了排序效率。

2.1 什么是希尔排序?

希尔排序是一种基于插入排序的排序算法,也被称为“缩小增量排序”。它的基本思想是将待排序的元素分成若干个小组,对每个小组进行插入排序;然后逐渐减小每组的元素个数,继续进行插入排序,直到每组只有一个元素为止。通过这种分组和逐渐减小增量的方式,希尔排序可以在一定程度上减少插入排序的移动操作次数,从而提高排序效率。

2.2 排序思路

采取先部分后整体的思路进行讲解

  • 部分
  1. 设置分组的间隔 gap。
  2. 将每个组看作一个新的数组进行插入排序。
  3. 插入排序的数组下标以及循环结束的条件需要改变,见下图解
  • 整体
  1. 重新设置分组的间隔gap,缩小组数,重复插入排序操作。
  2. 直至gap为1,对整体进行一次插入排序,则最终完成了对数组的排序。
  3. 关于gap的取值选择,目前尚无定论。取gap = gap / 3+1为例
    摘自《数据结构-用面向对象方法与C++描述》-殷人昆
     

2.3 C语言源码

void ShellSort(int* a, int n)
{
	int gap = n;
	//总逻辑
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		//多组排序逻辑
		for (int j = 0; j < gap; j++)
		{
			//一组排序逻辑
			for (int i = 0; i < n - gap; i++)
			{
				int end = i;
				int tmp = a[end + gap];
				while (end >= 0)
				{
					if (a[end] > tmp)
					{
						a[end + gap] = a[end];
						end -= gap;
					}
					else
					{
						break;
					}
					a[end + gap] = tmp;
				}
			}
		}
	}
}

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

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

相关文章

Django视图层探索:GET/POST请求处理、参数传递与响应方式详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

LeetCode刷题之HOT100之字母异位词分组

中午没有回宿舍午休&#xff0c;每次回去都没睡着&#xff0c;我想就没有必要回去了。京东买的书今天还没到&#xff0c;提前把题做了好专心做开发任务。 1、题目描述 2、逻辑分析 我看了几分钟&#xff0c;有点理解不了这道题需求是什么。看看题解。看了才理解题目的意思。字…

Java编程常见问题汇总四

系列文章目录 文章目录 系列文章目录前言一、忽略所有异常二、重复包装RuntimeException三、不正确的传播异常四、用日志记录异常五、异常处理不彻底 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

设计循环队列---力扣622

1、题目 1.1基础设置与讲解 循环队列&#xff0c;即固定长度的队列&#xff0c;可以想象成一个环形队列 就类似于这种队列&#xff0c;队尾指针后会有一个空位&#xff0c;用于控制判断队列为空还是为满&#xff1b; typedef int MyDataType;typedef struct {MyDataType fron…

弘君资本炒股开户:如何看待股价波动?

在股票商场上股价的动摇无疑是投资者最为关心的话题之一&#xff0c;面临股价的起伏不定投资者往往会感到迷茫和焦虑。关于怎么看待股价动摇&#xff0c;弘君资本下面就为大家详细介绍一下。 股价动摇是股市运行的常态&#xff0c;股市是国民经济的晴雨表&#xff0c;股票价格…

03数据卷及其挂载的命令

数据卷(虚拟目录)操作命令 在容器内部修改文件 docker exec -it nginx bash: 进入Nginx容器内部 docker exec: 进入容器内部,容器内部会模拟一份阉割版的Linux文件系统,只包含镜像运行时所需的环境和配置以及文件-it: 给当前进入的容器创建一个标准输入/输出终端方便我们与容…

浏览器阻止屏幕息屏,js阻止浏览器息屏,Web网页阻止息屏

场景: 比如打开一个浏览器页面(比如大屏),想让它一直显示着,而不是过几分钟不操作就屏幕黑了.(电脑有设置电脑不操作就会多长时间就会息屏睡眠,如果要求每个客户都去操作一下电脑设置一下从不睡眠,这很不友好和现实.而且我也只想客户在大屏的时候才这样,其他页面就正常,按电脑设…

HTTPS缺失?如何轻松解决IP地址访问时的“不安全”警告

一、问题现象 如果访问网站时出现以下任何一种情况&#xff0c;则说明该网站需要立即整改&#xff1a; 1.浏览器地址栏那里出现“不安全”字样&#xff1b; 2.小锁标志被红叉&#xff08;&#xff09;、斜线&#xff08;&#xff3c;&#xff09;等标志为不可用&#xff1b;…

二叉树的链式结构(二叉树)与顺序结构(堆)---数据结构

一、树的概念与结构 1、树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。我们常把它叫做树&#xff0c;是因为它看起来像一棵倒挂的树&#xff0c;它的根是朝上的&#xff0c;而叶是朝下的。 下面…

国产操作系统上Vim的详解03--使用Vundle插件管理器来安装和使用插件 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上Vim的详解03–使用Vundle插件管理器来安装和使用插件 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用Vundle插件管理器来安装和使用Vim插件的详解文章。Vundle是Vim的一款强大的插…

【GD32H757Z海棠派使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

11.1 实验内容 通过本实验主要学习以下内容&#xff1a; SPI简介 GD32H7 SPI简介 SPI NOR FLASH——GD25Q128ESIGR简介 使用GD32H7 SPI接口实现对GD25Q128ESIGR的读写操作 11.2 实验原理 11.2.1 SPI简介 SPI&#xff08;Serial Peripheral interface&#xff09;&#…

Oracle和mysql中插入时间字段

例如有id 和 times两个字段 Oracle insert into xxx values|(1,sysdate) mysql insert into xxx values(1,now()) 在 MySQL 中&#xff0c;SYSDATE() 函数也是可用的&#xff0c;它与 NOW() 类似&#xff0c;但略有不同&#xff1a; NOW…

pdf文件怎么合并成一个文件

在现代办公环境中&#xff0c;PDF文件的使用已变得非常普遍。它们具有跨平台、易读性强的特点&#xff0c;因此被广泛应用于各种场合。然而&#xff0c;当需要处理大量的PDF文件时&#xff0c;如何有效地将它们合并成一个文件&#xff0c;成为了一个需要解决的问题。本文将详细…

STM 32_HAL_SDIO_SD卡

STM32的SDIO&#xff08;Secure Digital Input Output&#xff09; 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信&#xff0c;支持多媒体卡&#xff08;MMC卡&#xff09;、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…

High School Math 2003

高中数学2003&#xff0c;离我远去&#xff0c;有些已经忘记了 2个小时。选择题和填空题答题时间2-4分钟。基础题、应用题大题为10分钟左右&#xff0c;不然肯定就是没时间做完&#xff0c;数学就是考察就是2小时单位时间内完成数量和质量&#xff08;正确率&#xff09;&#…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等

参考: https://310.ai/copilot 可以通过自然语言对话形式实现小分子、蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质…

真正用AI大模型的人,美国7%,日本1%,中国垫底

AI真实渗透率完整版大揭秘&#xff01;谁能告诉我&#xff0c;为何用的人寥寥无几&#xff1f; ✨ 结论&#xff1a;真正用AI的人&#xff0c;美国7%&#xff0c;日本1%&#xff0c;中国垫底。 &#x1f50d; 你是否以为AI早已无处不在&#xff1f;无所不能&#xff1f;可现实…

国内外低代码平台有哪些 6大热门国内外低代码厂商介绍

低代码开发平台是一种新兴的开发工具&#xff0c;它允许用户通过图形化界面和拖放操作来创建应用程序&#xff0c;而无需编写大量的代码。这种平台的优势在于能够大幅提高开发效率&#xff0c;降低企业成本&#xff0c;并让非技术人员也能够参与到应用开发过程中来。 国内低代码…

WEB攻防- Javascript项目特性- Node.js框架安全-识别审计-验证绕过

1、什么是JS渗透测试&#xff1f; 在Javascript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可能存在参数漏洞 JS开发的WEB应用和PHP&#xff0c;JAVA,NET等区别在于即使没有源代码&#xff0c;也可以通过浏览器的查看源代码获取真实的点。所以相当于JS开发的WEB…

模块搜索目录

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 当使用import语句导入模块时&#xff0c;默认情况下&#xff0c;会按照以下顺序进行查找。 &#xff08;1&#xff09;在当前目录&#xff08;即执行…