首页 > 其他分享 >NzN的数据结构--插入排序

NzN的数据结构--插入排序

时间:2024-04-10 09:58:37浏览次数:19  
标签:end -- 插入排序 gap 希尔 有序 排序 NzN

         排序排序我要Disney,今天我们先来看看经典排序算法里的插入排序,先三连后看才是好习惯!!!

目录

一、排序的概念及应用

1. 排序的概念

2. 排序的应用

3. 常见的排序算法

二、插入排序

1. 基本思想

2. 直接插入排序

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


一、排序的概念及应用

1. 排序的概念

        排序:排序就是使一串记录按照其中的某个或某些关键字的大小按递增/减排列起来。

        稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中, ,且 之前,而在排序后的序列中, 仍在 之前,则称这种排序算法是稳定的;否则称为不稳定的。

        内部排序:数据元素全部放在内存中的排序。

        外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

2. 排序的应用

3. 常见的排序算法

        本章我们向大家介绍的是插入排序,后面我们会继续为大家讲解其他的排序算法,大家给个关注,继续学~~~ 

二、插入排序

1. 基本思想

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

        实际中我们玩扑克牌时,就用了插入排序的思想。

2. 直接插入排序

        当插入第i个元素时,前面i-1个数据已经有序,此时用a [i]的排序码与前面元素的排序码顺序进行比较,找到插入位置进行插入,原来位置上的元素顺序后移。

//直接插入排序
void InsertSort(int* a, int n)
{
	//i<n-1时,end才会落在下标为n-2的位置
	//这样最后一个元素下标为n-1才不会越界访问
	for (int i = 0; i < n - 1; i++) 
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

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

  • 元素集合越接近有序,直接插入排序算法的时间效率越高
  • 时间复杂度:(最差情况是逆序,次数是等差数列1~n-1的和;最好情况是有序,需要遍历一遍,因此时间复杂度最好是
  • 空间复杂度:
  • 稳定性:稳定

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

        希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数gap,把待排序文件中所有记录分成几个组,所有距离为gap的记录分在同一组,并对每一组内的记录进行排序。重复上述分组和排序的工作。当gap=1时,所有记录在统一组内排好序。

        元素会越来越靠近有序。

gap越大,大的值更快调到后面,小的值更快调到前面,越不接近有序。

gap越小,大的值更慢调到后面,小的值更慢调到前面,越接近有序。

//希尔排序
void ShellSort(int* a, int n)
{
	//预排序:让元素接近有序,间距为gap的分为一组(gap>1)
	//直接插入排序:让元素有序(gap=1)
	int gap = n;
	while (gap > 1)
	{
		//gap /= 2;//无论gap是奇数还是偶数,最终等于1,但是预排序操作仍然较多
		gap = gap / 3 + 1;
		//gap最小为1,i<n-1看似下标只到n-2
		//但是当end=n-2时,a[end + gap]中gap为1就能访问a[n-1]
		for (int i = 0; i < n - gap; i++)//i++就可以直接实现每组交替完成插入排序
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
					break;
			}
			a[end + gap] = tmp;
		}
	}
}

希尔排序的特性总结:

  • 希尔排序是对直接插入排序的优化。
  • 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  • 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,因此我们暂时按照On1.25O1.6*n1.25 来计算。
  • 稳定性:不稳定(相同的排序可能会被分到不同组)

        以上就是插入排序的讲解内容,希尔排序相较于直接插入排序更难理解,大家要自己动手实现一下,那下一章我们就来学习选择排序吧!看完全文,给小编个三连支持一下~~

标签:end,--,插入排序,gap,希尔,有序,排序,NzN
From: https://blog.csdn.net/2301_79676950/article/details/137538582

相关文章

  • 基于java+springboot+vue实现的农产品智慧物流系统(文末源码+Lw)23-239
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用农产品智慧物流系统可以有效管理,使信息管......
  • 数据库性能优化调优
    0,创建的时候分库分表。表大小超过一定范围如2G1,主键顺序插入,性能好于乱序插入。推荐使用自增。2,合理索引设计,降低主键长度。在查询时,创建列的索引,然后查询用索引列升序降序查询。分页查询limit,最好覆盖索引。部分查询条件会使其索引失效,导致全盘扫描:w......
  • 基于java+springboot+vue实现的人事管理系统(文末源码+Lw)23-242
    摘 要使用旧方法对人事管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在人事管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的人事管理系统对字典管理、公告管理、绩效管理、......
  • docker安装emqx
    1.端口介绍1883MQTT/TCP协议端口11883MQTT/TCP协议内部端口,仅用于本机客户端连接8883MQTT/SSL协议端口8081management/HTTP/S协议端口8083MQTT/WS协议端口8084MQTT/WSS协议端口2拉取镜像dockerpullemqx/emqx:v4.0.03.启动临时容器dockerrun-itd--name......
  • 子网划分
    概念IP地址是以网络号和主机号来表示网络上的主机的,只有在一个网络号下的计算机之间才能“直接”互通,不同网络号的计算机要通过网关(Gateway)才能互通。但这样的划分在某些情况下显得并不十分灵活。为此IP网络还允许划分成更小的网络,称为子网(Subnet)。在线网络计算器https://......
  • [网鼎杯 2020 朱雀组]Nmap
    [网鼎杯2020朱雀组]Nmap类似Nmap的功能,一个输入命令行,提示输入ip地址,尝试输入正常内容:127.0.0.1nmap命令将扫描结果保存在文件里面:例如:将nmap127.0.0.1的结果保存在test.txt里面nmap127.0.0.1-oNtest.txtnmap其他写文件命令:-oN(标准输出)-oX(XML输出)-oS(ScR......
  • 删除文件文件夹时报错:系统找不到指定文件
    windows系统删除文件或文件夹时,报错提示,系统找不到指定文件,或是提示找不到该项目方法一重启电脑后重试方法二任务管理器CPU资源查询中检查文件的占用状态,结束相关联的进程后重试删除方法三结束explorer进程后,以cmd形式进入目标所在路径,使用del或rd命令删除之方法四chkdsk......
  • 技术公司与非技术公司的区别,真实!
    有人的地方就有江湖,就有人情世故,就算在大厂工作,技术是很重要,但不是最重要的。粉丝中有很多小伙伴是初入职场的,也有一些是工作几年的职场老鸟。不管初入职场还是职场老鸟,都要选择适合自己的公司,遵守职场的潜规则。所以对于程序员而言,选择一家技术公司还是非技术公司就显得尤为重要,......
  • 发布一个自己的composer包
    首先我们创建一个空的目录,并且运行以下命令初始化一个空白的composer包composerinit可以在命令窗口看到有返回提示;需要输入包名Thiscommandwillguideyouthroughcreatingyourcomposer.jsonconfig.`Packagename(<vendor>/<name>):我这里写的是chaoyang/test,回......
  • Blazor OIDC 单点登录授权实例7 - Blazor hybird app 端授权
    目录:OpenID与OAuth2基础知识BlazorwasmGoogle登录BlazorwasmGitee码云登录BlazorOIDC单点登录授权实例1-建立和配置IDS身份验证服务BlazorOIDC单点登录授权实例2-登录信息组件wasmBlazorOIDC单点登录授权实例3-服务端管理组件BlazorOIDC单点登录授权实......