【初阶数据结构】排序——插入排序

news2024/11/17 23:42:12

目录

  • 前言
  • 直接插入排序
  • 希尔排序

请添加图片描述

前言

  排序:所谓排序就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作排序算法,就是如何使得记录按照要求排列的方法。
  例如:买东西时会根据销量或价格排序综合比对,又如玩扑克牌时会将手中的牌按自己喜欢的顺序进行排序等待,排序在生活中很常见,常见的排序算法又有以下几种:
在这里插入图片描述
下面我们就来讲讲插入排序。

直接插入排序

  直接插入排序是一种简单的插入排序法。

基本思想待排序的数据逐个插入到一个已经排好序的序列中,使其同样为有序序列,直到所有的记录插完为止,得到一个新的有序序列。

  实际上我们玩扑克牌时就会用到此思想:先拿起一张放手上,拿第二张时会和第一张比较大小,以此来插入,拿第三张时又会对比前两张的大小,找到合适的位置插入……
我们可以简单来看一下排序过程:
在这里插入图片描述
过程分析(以升序为例):

  • 第一个数看成是一个有序序列,从第二个元素开始逐个插入到这有序序列中。
  • 当插入第i(i>=1)个元素时,前面的a[0]……a[i-1]都已经排好序
  • 此时将a[i]的大小与按照从右至左的顺序依次进行比较,找到第一个比它的数字,记为a[end]
  • a[end]后面的数都往后挪一位,a[end+1]处插入那个元素
    在这里插入图片描述
    具体代码如下:
//思想就像理扑克牌一样,把第一项当成有序,后面依次插入
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] > tmp)//一直找到比tmp小的值
			{
				a[end + 1] = a[end];
				end--;
			}
			else
				break;
		}
		//若未找到跳出循环证明tmp最小,此时end=-1,tmp插在end+1也就是最前面
		a[end + 1] = tmp;
	}

}

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

  1. 元素集合越接近有序直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2^)
    按照最坏情况来看是逆序时,第2个数字插入前面数字往后挪1位,第3个数字插入时前面数字要往后挪两位,以此类推,到第n个数字插入时则前面的数字要往后挪n-1位,所有挪动次数相加是一个等差数列,则量级就为n^2^。
  3. 空间复杂度:O(1)
  4. 稳定性:稳定

希尔排序

希尔排序法又称缩小增量排序。
其基本思想如下:

  1. 先选定一个整数gap,将待排序的数据分成gap组,且所有距离为gap的分在一个组
  2. 对所有组分别进行排序
  3. 缩小gap,重新分组,对所有组别重新排序。
  4. 重复上述操作,待gap为1时,则进行插入排序,使其所有数据有序。

先来看看是如何分组的:
在这里插入图片描述

过程分析(以升序为例):

  1. 首先确定gap的初始值,这并没有一个确切的答案,在最开始首先定义gap = n(n为元素个数),但我们不能取n作为gap,会没有任何意义,一般取gap = gap/2或者是gap = gap/3+1作为初始值。
  2. 确定结束条件,即当gap>1则进入循环,然后根据gap = gap/2或者是gap = gap/3+1缩减gap,当循环判断gap==1时,说明在上一次循环时已经进行了直接插入排序,数列已经有序了,则不需要进入循环。
    因此外部大循环可写为如下:
int gap = n;//n是数据个数
while(gap > 1)
{
	//gap /= 2;
	gap = gap/3 + 1;//这两种写法都可以,都能保证在最后gap=1,使其进行直接插入排序
	//.....
}

下面则是单趟排序的过程:
在这里插入图片描述
单趟排序的过程和直接插入排序的过程差不多,我们直接来看代码:

void ShellSort(int* a, int n)//希尔排序
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;///保证最后一趟gap一定为1,进行插入排序
		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;
		}
	}
}

由代码发现,实际上并不是一组一组进行排序的,
在这里插入图片描述
希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化
  2. gap>1时都属于是预排序:即分组插入排序,将大的数更快放到后面,小的数更快放到前面,目标是使序列接近有序
  3. gap==1时,就是直接插入排序,此时序列已经接近有序,再插入排序就会快很多。
  4. 希尔排序的时间复杂度不好计算,可以记住大约在O(N^1.3^)即可。

感谢大家观看,如果大家喜欢,希望大家一键三连支持一下,如有表述不正确,也欢迎大家批评指正。
请添加图片描述

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

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

相关文章

基于PHP+MySQL组合开发地方门户分类信息网站源码系统 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网技术的飞速发展&#xff0c;地方门户分类信息网站逐渐成为城市生活不可或缺的一部分。它们涵盖了房产、招聘、二手交易、生活服务等多个领域&#xff0c;为当地居民提供了全方位的信息服务。为了满足这一市场需求&#xff0c;我们开发了这款基于PHPMySQL的…

23中设计模式,以及三种常见的设计模式demo

常见的23种设计模式 Java设计模式是软件工程中常见的解决方案&#xff0c;用于解决在软件设计中反复出现的问题。设计模式可以分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。这里&#xff0c;我将简单介绍三种常见的设计模式&#xff0c;并给出相应的Java代码示例…

【车联网安全】车端网络攻击及检测的框架/模型

参考标准&#xff1a; 《汽车数据安全管理若干规定&#xff08;试行&#xff09;》ISO/SAE 21434《道路车辆 网络安全工程》威胁分析和风险评估&#xff08;TARA&#xff09;ISO/DIS 24089R155法规的国标转换&#xff1a;《汽车整车信息安全技术要求》&#xff08;UN R155&…

keil软件编写第一个c语言单片机程序并下载到单片机点亮一个发光二极管

Project-->new project-->选择文件夹-->输入工程名如&#xff1a;lession_1-->选择单片机芯片类型&#xff08;Atml的89c52&#xff09;-->newfile -->保存输入C语言文件名lession_1.c-->在左侧source Group 1右键--->选择add files to group “Source…

seaCMS v12.9代码审计学习(上半)

文章目录 CMS介绍环境搭建代码总览漏洞复现/js/player/dmplayer/player/index.php 反射性xss(详见https://github.com/HuaQiPro/seacms/issues/28)admin_ping.php 代码执行漏洞太多了&#xff0c;整理完了下半部分一次性写完 CMS介绍 海洋cms是一款经典的开源影视建站系统&…

使用celery+Redis+flask-mail发送邮箱验证码

Celery是一个分布式任务队列&#xff0c;它可以让你异步处理任务&#xff0c;例如发送邮件、图片处理、数据分析等。 在项目中和celery 有关系的文件如下&#xff1a; task.py : 创建celery.py 对象&#xff0c;并且添加任务&#xff0c;和app绑定&#xff0c;注意&#xff1…

C# CS1612 尝试修改集合中值类型的情况

在C#中&#xff0c;发现尝试直接修改集合中值类型的中的值发生报错 提示“它不是变量”&#xff0c;通过官方索引的链接可知&#xff0c;尝试修改某一值类型&#xff0c;但是该值类型作为中间表达式的结果生成但不存储在变量中&#xff0c;会发生报错。 正确做法是将其赋值给局…

网络安全-长亭雷池waf的sql绕过,安全狗绕过(5种绕过3+2)

目录 一、环境 二、讲解 三、绕过前思路整理 3.1 思路 3.1.1 入门思路 0x00截断filename 3.1.2 双写上传描述行(差异绕过&#xff09;【成功】 3.1.3双写整个 part 开头部分 3.1.4 构造假的 part 部分 1【成功】 3.1.5 构造假的 part 部分2【成功】 3.1.6 两个 bounda…

网络战时代的端点安全演变

​ 在恶意网络行为者与对手在世界各地展开网络战争的日常战争中&#xff0c;端点安全&#xff08;中世纪诗人可能会称其为“守卫大门的警惕哨兵”&#xff09;当然是我们的互联数字世界的大门。 端点安全类似于我们今天称之为现代企业的数字有机体的免疫系统&#xff0c;可以将…

考研数据结构——C语言实现小顶堆

数组初始化&#xff1a; 首先&#xff0c;我们有一个整数数组arr&#xff0c;里面包含了一系列需要排序的数字。数组的长度n是通过对数组arr的总字节大小除以单个元素的字节大小得到的。 小顶堆调整函数&#xff1a; adjustHeapMin函数的作用是将数组中的元素从某个节点向下调整…

服务启动慢分析小记

文章目录 1. 写在最前面2. 分析过程2.1 初步分析 2.2 深入分析2.2.1 是否为 master 卡住2.2.2 分析 sidecar 侧2.2.2.1 gdb 调试2.2.2.2 dlv 调试 3. 碎碎念4. 参考资料&#xff1a; 1. 写在最前面 不出意外&#xff0c;就是要出意外。还是忙忙碌碌木有学习 AI 知识的一个月&a…

linux配置git

一、生成新的 SSH 密钥 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 按照提示操作&#xff1a; 当提示 Enter file in which to save the key (/root/.ssh/id_rsa): 时&#xff0c;直接按回车键使用默认路径。 当提示 Enter passphrase (empty for no p…

CSS样式的4种引入方法

1.行内样式 1.只能影响标签内的样式 2.行内样式可以应用在<body>标记内的所有子标记包括<body>标记在内&#xff0c;但是不能用在<head><title><meta>中 3&#xff0c;行内样式的标记优先级最高 语法&#xff1a;直接再标记内写style属性 &…

PCL 用八叉树方法压缩点云

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1点云压缩 2.1.2点云解压缩 2.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…

基于深度学习的数字识别系统的设计与实现(python、yolov、PyQt5)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

VisualStudio如何卸载Resharper插件?

本来按理说&#xff0c;卸载插件应该就是在扩展下的已安装插件中&#xff0c;找到该插件&#xff0c;点一下就会出现卸载的按钮的。 没想到这个Resharper这么吊&#xff0c;卸载按钮居然是个灰色的&#xff0c;意思就是此路不通&#xff0c;有特权的。 那么这种情况下&#x…

DC-DC动态响应度的优化

DC-DC动态响应度的优化 以MP2315模块为例到底怎么样才能改变动态响应度呢&#xff1f;修改前馈电容修改电感也可以改善动态响应度 以MP2315模块为例 DC-DC输出位置再增加电容 从下面的波形图看出&#xff0c;多了一颗输出电容之后的结果&#xff0c;似乎有那么一点点作用但是…

【JS】严格模式/非严格模式的区别

JS的严格模式和非严格模式 js运行有两种模式&#xff1a;一种是普通模式&#xff1b;一种是严格模式。 严格模式是ES5添加的&#xff0c;是比普通模式多一部分的js规则。如果在ES5之前js解析引擎&#xff0c;会忽略严格模式。 js一般默认是普通模式&#xff0c;ES6的模块和Cla…

【优选算法之位运算】No.7--- 经典位运算算法

文章目录 前言一、位运算几种模型&#xff1a;1.1 基础的位运算&#xff1a; << >> ~ & | ^1.2 几种模型&#xff1a;1.3 模型练习 二、位运算示例&#xff1a;2.1 判定字符是否唯⼀2.2 丢失的数字2.3 两整数之和2.4 只出现⼀次的数字 II2.5 消失的两个数字 前…

frp内网穿透服务器+客户端详细配置

当我们拥有一台云服务器时&#xff0c;可以将局域网服务器的服务通过内网穿透发布到公网上。frp是一个主流的内网穿透软件&#xff0c;本文讲解frp内网穿透服务器客户端详细配置。 一、需要准备的内容&#xff1a; 腾讯云服务器&#xff1a;https://curl.qcloud.com/Sjy0zKjy 2…