数据结构——lesson10排序之插入排序

news2024/11/15 4:16:31

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:数据结构学习笔记 、排序算法合集
💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信我哦~

上篇我们学习了选择排序的两种算法——直接选择排序与堆排序,今天我们将学习插入排序,它也有两种——直接插入排序与希尔排序🥳🥳

1.直接插入排序

1.1基本思想

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

实际中我们玩扑克牌时,就用了插入排序的思想:
在这里插入图片描述

每次摸到一张牌我们就会把他和前面的牌逐一比较,直到找到适合它的位置进行交换,同时后面的牌要顺位往后移一位,因为中间加了一张牌。

图解如下:

在这里插入图片描述

每次取一个数与前面的数比较,直到找到合适的位置

1.2代码实现如下

// 插入排序
void InsertSort(int* a, int n)
{
	//排n-1趟
	for (int i = 1; i < n; i++)
	{
		int endi = i - 1;//endi表示已经排好序的尾标
		int tmp = a[i];//首先保存要排序的数,一会就会被覆盖了
		//一趟排序
		while (endi >= 0)
		{
			if (a[endi]  > tmp )//只要前面的数大于tmp, 则前面的这些数都向后挪动一个位置
			{
				a[endi + 1] = a[endi];
				endi--;
			}
			else
				break;
		}
		a[endi + 1] = tmp;//最后再把挪动后空出来的位置给tmp

	}
}

以上面动图的数据为例:

int a[] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };

结果如下:
在这里插入图片描述

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

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)

从下标为1开始每次拿出数组的一位数与前面的数进行比较,按照最坏的情况前面所有的数都比较一次,时间复杂度可以看成1+2+3+4+…+n-1;结果是O(N^2);如果元素集合接近有序则不需要和前面所有的数比较时间复杂度大大减少,最好时(有序)可以达到O(n).

  1. 空间复杂度:O(1),它是一种稳定的排序算法
  2. 稳定性:稳定

2.希尔排序

2.1基本思想

希尔排序法又称缩小增量法。
希尔排序法的基本思想是:先选定一个整数gap,把待排序文件中所有数分成几个组,所有距离为gap的数分在同一组内,并对每一组内的数进行排序。然后将选定的gap按规律依次减少,重复上述分组和排序的工作。直到gap为1时,此时就是直接插入排序,因为之前进行的预排序已经将该组数排得接近有序了,所以最后一次排序时时间复杂度大大减少。

图解如下:
在这里插入图片描述

记得每次分组时不是单一的将n个数分成gap组而是从下标为0开始间隔gap距离的数直到末尾的几个数分成一组,再从下标为1开始间隔gap的数分为一组…图解如下:
在这里插入图片描述上面1、3、9、6还应该加一个7漏了写了;因为每个都是与后面gap距离的数比较所以我们直接for循环从下标为0到n-1即可,然后比较时与距离为gap的比较,具体可看下面的代码实现。

希尔排序分为两个步骤:预排序(当gap>1)和直接插入排序(gap=1)

2.2代码实现如下


// 希尔排序
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)//不能写成大于0,因为gap的值始终>=1
	{
		//只有gap最后为1,才能保证最后有序
		//所以这里要加1
		gap = gap / 3 + 1;
		//这里只是把插入排序的1换成gap即可
		for (int i = gap; i < n; i++)
		{
			int endi = i - gap;
			int tmp = a[i];
			//一趟排序
			while (endi >= 0)
			{
				if (a[endi] > tmp)
				{
					a[endi + gap] = a[endi];
					endi -= gap;
				}
				else
					break;
			}
			a[endi + gap] = tmp;

		}
	}
}

在这里插入图片描述

2.3希尔排序特性

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

3.结语

插入排序也有两种——直接插入排序和希尔排序;希尔排序是由希尔发明的对直接插入排序的一种优化,使用gap来跳跃实现,不得不说这位大佬的思维也很跳跃,希尔排序关键理解它的分组以及gap每次都要依次减少直到为1才能实现排序,不是说一次gap就可以实现排序。以上就是插入排序的实现啦~ 完结撒花 ~🥳🥳🎉🎉🎉

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

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

相关文章

项目中遇到的sql问题记录

有一张表&#xff0c;表结构及数据如下&#xff1a; INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) VALUES (approve001, 2021-02-18 00:00:00, tableA, 2024-03-18); INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) …

江科大STM32学习笔记(上)

STM32F103xx 前言外设篇GPIO输出GPIO位结构GPIO模式外设的GPIO配置查看实战1&#xff1a; 如何进行基本的GPIO输入输出 OLED显示屏及调试Keil的调试模式演示 EXTI外部中断NVIC基本结构EXTI结构代码实战2&#xff1a;如何使用中断和对射式红外传感器&#xff06;旋转编码器 TIM&…

avue 框架(原生)点击的时候状态未过,一直处于加载状态如何解决

方法&#xff1a; //关闭avue自带弹框 this.$refs.crud.$refs.dialogForm.closeDialog();//取消加载状态 loading(false); // 设置loading状态为false&#xff0c;表示加载完成

huawei 华为交换机 配置手工模式链路聚合示例

组网需求 如 图 3-21 所示&#xff0c; SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络&#xff0c;SwitchA 和 SwitchB 之间有较大的数据流量。 用户希望SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同 VLAN 间互相通信。 同时用户也希望能够提…

xAI 发布 Grok-1 — 最大的开源LLM

xAI 发布 Grok-1 — 最大的开源LLM 图片由 Jim Clyde Monge 提供 埃隆马斯克&#xff08;Elon Musk&#xff09;的人工智能公司xAI在Apache 2.0许可下发布了其3140亿参数的专家混合模型Grok-1的权重和架构。 在此之前&#xff0c;马斯克上周一承诺向公众免费提供格罗克。作为…

在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

构建 SyterKit 作为 Bootloader SyterKit 是一个纯裸机框架&#xff0c;用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板&#xff0c;SyterKit 使用 CMake 作为构建系统构建&#xff0c;支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能&a…

Coursera上Golang专项课程3:Concurrency in Go 学习笔记(完结)

Concurrency in Go 本文是 Concurrency in Go 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Concurrency in GoMODULE 1: Why Use Concurrency?Learning Objectives M1.1.1 - Parallel ExecutionM1.1.2 - Von Neumann BottleneckM1.1.3 - Power W…

并发编程之共享带来的问题的详细解析

4.1共享带来的问题 Java代码示例 两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;结果是 0 吗&#xff1f; static int counter 0; public static void main(String[] args) throws InterruptedException {Thread t…

如何正确从github上下载数据集等内容

文章目录 一、现象&#xff1a;二、解决方案 一、现象&#xff1a; 数据集点击下载没有反应&#xff0c;那需要怎么下载数据集呢&#xff1f; 二、解决方案 输入以下命名行&#xff0c;亲测有效 git clone https://github.com/mymusise/ChatGLM-Tuning.git

CSS 让元素根据内容自适应宽度

一、需求 点击链接跳转&#xff0c;只点击标红区域才跳转&#xff0c;右侧空白区域不要跳转 二、实现 宽度太宽&#xff0c;导致右侧空白区域也加了跳转效果&#xff0c;修改为 将元素的最大宽度设置为其内容所需的宽度。 方法一&#xff1a;建议方式 使用 display: inline…

HTML5语义化元素

在HTML5之前&#xff0c;网站的分布层级有哪些呢&#xff1f; nav&#xff0c;header&#xff0c;main&#xff0c;footer 这样做有一个弊端 我们往往过多的使用div&#xff0c;通过ID或class来区分元素 对于浏览器来说这些元素不够语义化 对于我来说搜索引擎来说&#xff0c;不…

基础:TCP三次握手做了什么,为什么要握手?

1. TCP 三次握手在做些什么 1. 第一次握手 &#xff1a; 1&#xff09;握手作用&#xff1a;客户端发出建立连接请求。 2&#xff09;数据处理&#xff1a;客户端发送连接请求报文段&#xff0c;将SYN位置为1&#xff0c;Sequence Number为x;然后&#xff0c;客户端进入SYN_S…

Halcon 3D算子总结整理

halcon 3D包含以下几个模块&#xff1a; 3D Matching&#xff08;3D匹配&#xff09;3D Object Model&#xff08;3D模型&#xff09;3D Reconstruction&#xff08;3D重构&#xff09;3D Transformations&#xff08;3D转换&#xff09; 1. 3D Matching 1.1 3D Box3D盒查找器…

分布式搜索引擎elasticsearch专栏一

初识elasticsearch 1.1了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在码云搜索代码 在电商网站搜索商品 在百度搜索答案 1.1.2.ELK…

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**&#xff1a; cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3&#xff1a;显示前一个月、当前月和下一个月的日历。-y&#xff1a;显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

AR/MR产品设计(二):如何用一双手完成与虚拟对象的自然交互

AR/MR产品设计&#xff08;二&#xff09;&#xff1a;如何用一双手完成与虚拟对象的自然交互 - 知乎 手是我们与现实世界交互最重要的方式&#xff0c;同样在虚实混合的世界中是最重要的交互方式 在AR/MR/VR的交互中&#xff0c;手势交互会作为XR的重要交互动作&#xff0c;因…

Zookeeper(2)常用命令,ACL权限

文章目录 前言一、zk节点和节点类型节点类型 二、常用命令1.客户端连接2.常用命令help 帮助命令创建节点getsetdeletedeleteall pathstat查看节点的状态setquota增加配额listquota /frame 查看配额delquota删除配额 三、ACL权限控制&#xff1a;1、ZooKeeper权限特性&#xff1…

本地虚拟机平台Proxmox VE结合Cpolar内网穿透实现公网远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Jenkins Windows关闭跨站请求伪造保护(CSRF)

禁用CSRF保护 为了在Jenkins中禁用CSRF保护&#xff0c;请按照以下步骤操作&#xff1a; 定位Jenkins服务 在Windows搜索栏中输入services.msc&#xff0c;然后按Enter键打开服务。在服务列表中找到Jenkins服务。右键点击Jenkins服务&#xff0c;选择属性 可以进入配置目录 …

求解3、4、6自由度仿射变换矩阵

说明&#xff1a;一开始将目光放在了opencv上&#xff0c;发现只有4、6自由度的仿射变换求解&#xff0c;后来发现skimage十分强大。 注&#xff1a;美中不足的是&#xff0c;skimage的实现没有RANSAC。 function&#xff1a;skimage.transform.estimate_transform() ttypeeu…