常见排序算法——插入排序(直接插入排序 希尔排序)

目录

直接插入排序

基本思想

代码实现

时间复杂度计算 

特性总结

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

基本思想

代码实现

时间复杂度计算

特性总结


直接插入排序

基本思想

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。具体如下图所示:

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

代码实现

// 插入排序		
void InsertSort(int* arr, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		//end表示已经排好序的尾标
		int end = i;
		//保存要排序的数,一会就会被覆盖
		int tmp = arr[end + 1];
		//注意end可以等于0  (tmp比前面所有数字都要小)
		//while (end >= 0 && arr[end] < tmp)//降序
		while (end >= 0 && arr[end] > tmp)  //升序
		{
			//语句顺序不能乱	先交换再--
			arr[end + 1] = arr[end];
			end--;
		}
		arr[end + 1] = tmp;
	}
}

时间复杂度计算 

特性总结

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定       (遍历数组不会改变相同元素的相对顺序) 

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

基本思想

先选定一个整数,把待排序文件中所有记录分成多个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后,减小gap,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序。

 可以理解为希尔排序是对插入排序的优化,这样做能让大的数更快到达后面,小的数更快到达前面,完成排序。

当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。

代码实现

// 希尔排序
void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap > 1)
	{
		//只有gap最后为1,才能保证最后有序,所以这里要加1
		gap = gap / 3 + 1;
		//下面类似直接插入排序  区别在于将1换成gap
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				//if(arr[end] < tmp)//降序
				if (arr[end] > tmp)//升序
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
					break;
			}
			arr[end + gap] = tmp;
		}
	}
}

时间复杂度计算

希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好多书中给出的希尔排序的时间复杂度都不固定:

《数据结构(C语言版)》--- 严蔚敏

 《数据结构-用面相对象方法与C++描述》--- 殷人昆

因为我们的gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,我们暂时就按照:O(N ^ 1.25)到O(1.6 * N ^ 1.25)来算。 

特性总结

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序;当gap == 1时,数组已经接近有序的了。
  3. 时间复杂度:O(N ^ 1.25)~O(1.6 * N ^ 1.25)
  4. 空间复杂度:O(1)
  5. 稳定性:不稳定       (不能保证原来所具有的相对次序)

不能保证具有相同排序码的记录原来所具有的相对次序,即原来排在前面的,经过排序后有可能排某个具有相同码的记录的后面,例如排序码43,89,21,43,28,15,经过5遍排序后次序为15,21,28,43,43,89。排序前第一个位置上的排序码43现在位于第5个位置。

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

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

相关文章

OpenCV读取图片

import cv2 as cv # 读取图像 image cv.imread(F:\\mytupian\\xihuduanqiao.jpg) # 创建窗口 cv.namedWindow(image, cv.WINDOW_NORMAL) #显示图像后&#xff0c;允许用户随意调整窗口大小 # 显示图像 cv.imshow(image, image) cv.waitKey(0)import cv2 as cv srccv.imread(…

【AI基础】概览

一、目的 主要梳理一下大模型的相关概念&#xff0c;并在此基础上&#xff0c;部署安装最基础的AI运行环境&#xff0c;以达到输出AI领域的helloworld。 总的来说如图&#xff1a; 按照从下往上的顺序来理解&#xff0c;也是从下到上的顺序来安装部署。 规则1 注意每个层级的…

defer+recover机制处理错误

问题&#xff1a;多个协程工作&#xff0c;其中一个协程出现panic&#xff0c;导致程序崩溃 解决办法&#xff1a;利用deferrecover捕获panic进行处理&#xff0c;即使协程出现错误&#xff0c;主线程仍然不受影响可以继续执行 package mainimport ("fmt""tim…

python的np.array()函数

1、创建数组 2、 与矩阵相关的函数 3、与排序相关的函数 4、 一元计算函数 5、 多元计算函数 6、 与文件读写相关的函数 7、与数组形状、属性相关的函数 8、 常用计算函数 9、 数组选取:切片和索引 10、np.random相关函数 Numpy常用的20个函数 一…

STM32CUBEIDE使用技巧

一、创建文件 二、菜单栏和工具栏说明 三、编译/下载/仿真调试 1、编译的两种模式 Debug模式和Release模式&#xff0c;Debug模式在调试阶段时使用&#xff0c;Release模式在项目完结发给客户时使用&#xff0c;Release模式不能使用单步调试功能。 2、下载方式 下载可以在ST…

【LeetCode滑动窗口算法】长度最小的子数组 难度:中等

我们先看一下题目描述&#xff1a; 解法一&#xff1a;暴力枚举 时间复杂度&#xff1a;o(n^3) class Solution { public:int minSubArrayLen(int target, vector<int>& nums){int i 0, j 0;vector<int> v;for (;i < nums.size();i){int sum nums[i];fo…

JWT工具【工具类】

一、JWT JSON Web Token (JWT)是一个开放标准&#xff08;RFC 7519&#xff09;&#xff0c;定义了一种紧凑且自包含的方式&#xff0c;以JSON对象的形式在各方之间安全地传输信息。这种信息可以被验证和信任&#xff0c;因为它是数字签名的。具体来说&#xff0c;JWT是一种用…

[leetcode]swap-nodes-in-pairs

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new ListNode(0);dummyHead->next head;ListNode* temp dummyHead;while (temp->next ! nullptr && temp->next->next !…

记录pytest中场景执行的token异常处理问题

前言中写了一个conftest钩子函数用于处理重复调用token的方法&#xff0c;http://t.csdnimg.cn/N4rCK&#xff0c;每个用例单独执行都很正常&#xff0c;但是批量执行时一直报错&#xff0c;token缓存处理也不生效。 所有的用例都报获取不到token&#xff0c;方法改了又改&…

WPF学习(3)--不同类通过接口实现同种方法

一、接口概述 1.接口的概念 在C#中&#xff0c;接口&#xff08;interface&#xff09;是一种引用类型&#xff0c;它定义了一组方法、属性、事件或索引器&#xff0c;但不提供实现。接口只定义成员的签名&#xff0c;而具体的实现由实现接口的类或结构体提供。接口使用关键字…

场外期权能不能开户?场外期权在哪里开?

今天带你了解场外期权能不能开户&#xff1f;场外期权在哪里开&#xff1f;近年来&#xff0c;场外期权交易在金融市场上逐渐盛行起来。有许多人对于场外期权的开户问题感到困惑。 场外期权能不能开户&#xff1f; 资质要求&#xff1a; 个人投资者需要具备一定的金融知识和投…

非阻塞IO简介和代码实例

接上篇 阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介-CSDN博客文章浏览阅读90次。阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介https://blog.csdn.net/CSDN_DU666666/article/details/139598410?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%2…

什么是电脑监控软件?六款知名又实用的电脑监控软件

电脑监控软件是一种专为监控和记录计算机活动而设计的应用程序&#xff0c;它能够帮助用户&#xff08;如家长、雇主或系统管理员&#xff09;了解并管理目标计算机的使用情况。这些软件通常具有多样化的功能&#xff0c;包括但不限于屏幕捕捉、网络行为监控、应用程序使用记录…

JUnit5学习笔记

1.JUnit5的变化 JUnit 5 JUnit Platform JUnit Jupiter JUnit Vintage JUnit Platform: Junit Platform是在JVM上启动测试框架的基础&#xff0c;不仅支持Junit自制的测试引擎&#xff0c;其他测试引擎也都可以接入。 JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模…

『原型资源』Axure自带图标库不够用,第三方经典图标库来袭

​今天小编为大家带来第三方经典图标库&#xff0c;己确认内容可用现推荐给大家。直接上手就可不用自己画哈~ 获取原型文档请与班主任联系&#xff01; 先睹为快&#xff0c;合适再拿走不谢&#xff1a; 图标太多&#xff0c;截取部分给大家参考o(*&#xffe3;︶&#xffe3;*…

恭喜!X医生斩获英国伦敦大学学院访问学者邀请函

伦敦大学学院&#xff08;University College London&#xff0c;简称&#xff1a;UCL&#xff09;&#xff0c;1826年创立于英国伦敦&#xff0c;是一所公立研究型大学。伦敦大学联盟的创校学院、罗素大学集团和欧洲研究型大学联盟创始成员&#xff0c;也是金三角名校和G5之一…

东胜物流软件 GetProParentModuTreeList SQL注入漏洞复现

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…

雷军出手,光储充一体化赛道可太行了

雷军出手&#xff0c;特斯拉、宁德时代、奥能电源持续加码&#xff0c;光储充一体化赛道可太行了 近几年&#xff0c;各地光储充一体化项目遍地开花&#xff0c;正式投入运营的新闻接连不断。被视为全球能源转型重要驱动力的光储充一体化&#xff0c;已成为各大企业竞相入局的新…

复合机器人以其高度的灵活性和操作效率,展现了显著的优势

随着工业4.0的深入推进和智能制造的快速发展&#xff0c;复合机器人作为一种集成移动机器人和工业机器人功能的先进设备&#xff0c;正逐步成为工业自动化领域的新宠。特别是在磁钢上下料的应用中&#xff0c;复合机器人以其高度的灵活性和操作效率&#xff0c;展现了显著的优势…

【python】在【机器学习】与【数据挖掘】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; 数据清洗&#x1f49e; 数据变换&#x1f49e; 数据归一化&#x1f49e; 高级预处理技术&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; 特征选择&…