排序篇--插入排序及希尔排序

news2024/9/20 12:40:48

前言

        此次的排序均按照升序为例

        排序大家都不陌生,生活中处处有排序。什么排名,评分,分数等。这其中最简单的应该就是冒泡排序了,在这里就不多说了。


提示:以下是本篇文章正文内容,下面案例可供参考

一、排序的概念?

        排序还有概念?!对的。所谓排序就是给一串数据,按照其中的一个,或多个关键信息的大小,按照递增或递减的方法排列的操作。

二、实现排序

1.插入排序

        以升序为例:我们将一个数组里的前两个当作一个区间,每完成一次区间的排序,右区间增大一位。

        将一串数组当作区间,从前两个元素开始,当作一个区间,同后面一位的元素进行比较,如果比后面元素大,则进行交互元素,如果小不交换,元素区间向后走一位,直到整个数组成为它的区间,代表排序完成。

        排序有两种情况,都在图片中表现出来了 。

         

//	升序
void insert_sort(int* m, int n)
{
	for (int i = 1; i < n; i++)
	{
//		tmp表示区间的后一个元素,0 - end是排序的区间,所以end的下标要永远比tmp的下标小1
		int tmp = m[i], end = i - 1;
		//	将tmp插入到 0~end 区间内
		while (end >= 0)    //这里一定是小于等于,有一种可能是有一位比前面一位都要小
		{
		//    上面画的有图,结合一块观看可以有助于理解代码逻辑
			if (tmp < m[end])
			{
				m[end + 1] = m[end];
				--end;
			}
			else
			{
				break;
			}
		}
        m[end + 1] =  tmp;
	}


	for (int i = 0; i < n; i++)
	{
		printf("%d ", m[i]);
	}
}

         优点:插入排序在元素越接近有序时间越快。

                     时间复杂度:最好O(N),最坏:O(N^2)。它比较稳定

2.希尔排序

        希尔排序(缩小增量排序)是插入排序的升级版。它由于插入排序元素越是接近有序时间越快。所以先进行gap个间隔的排序。将相对较小的跑前面,相对较大的跑到后面,让它接近有序,最后进行上述的插入排序使它的排序时间变得更快。

        希尔排序的基本思想是将待排序的数组元素按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。对于不同规模的数据,希尔排序都能保持较好的性能。此外在希尔排序中gap的次数没有确定的答案。

        我这里采用的是 gap / 2的方式进行递减半的方式按组排序,同时gap > 1 且 gap /= 2在循环里面,那么当gap = 1的时候是最后一轮循环,排序完成。

        希尔排序的时间复杂度根据gap来判定通常导致的时间复杂度在O(n^2)和O(nlogn)之间,但更接近于O(n^1.3)到O(n^1.5)之间。

void shell_sort(int* m, int n)	//希尔排序
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;
		//	gap是多少,就需要排列几组
		for (int i = 0; i < gap; i++)
		{
			//	一次gap所以范围内的数进行排序
			for (int j = i; j < n - gap; j += gap)
				//		for (int j = 0; j < n - gap; j++)
			{
				int end = j, tmp = m[j + gap];
				//			int end = j, tmp = m[j + gap];
							//	一次区间进行交互
				while (end >= 0)
				{
					if (tmp < m[end])
					{
						m[end + gap] = m[end];
						end -= gap;
					}
					else
					{
						break;
					}
				}
				m[end + gap] = tmp;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		printf("%d ", m[i]);
	}
}

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

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

相关文章

构造方法,JavaBean,对象内存图,基础数据类型和引用数据类型

构造器&#xff0c;构造函数 在创建对象的时候给成员变量进行赋值 修饰符 类名&#xff08;参数&#xff09;{ 方法体&#xff1b; } 如果我们没有写任何的构造方法&#xff0c;虚拟机会帮我们加一个空参构造方法 可以手动建一个空参&#xff0c;看是否调用成功。 如果我们…

负载均衡详细概念介绍之(四层和七层实现)

目录 一、负载均衡介绍 1.1什么是负载均衡 ​编辑 1.2 为什么要用负载均衡 二、负载均衡的类型 2.1 通过一些硬件实现 2.2 四层负载均衡 2.3 七层负载均衡 三、四层和七层的区别 及特点 一、负载均衡介绍 1.1什么是负载均衡 负载均衡:Load Balance&#xff0c;简称LB&a…

slowfast

核心网络网络架构: 1、分别获取高频和低频图像数据 2、分别进行特征提取 3、特征融合 4、预测 网络结构细节&#xff1a;

网站如何被Google收录?

想让你的网站快速被Google收录&#xff1f;试试GSI快速收录服务吧&#xff0c;这是通过谷歌爬虫池系统来实现的。这套系统吸引并圈养Google爬虫&#xff0c;提高你网站的抓取频率。每天有大量Google爬虫抓取你的网站页面&#xff0c;大大提高了页面的收录概率&#xff0c;从而增…

SpringBoot的使用的注解以及监控监控和lombok使用

目录 修改SpringBoot项目中依赖的版本号 为什么默认是8.0.23版本 修改方法 第一种 &#xff1a;直接在pom.xml中引入相关依赖时直接指定版本号 第二种&#xff1a;在pom.xml中的属性中进行修改 SpringBoot自动化配置web项目 Configuration注解 Import注解 1.导入Bean 2…

C++_进阶:C++11新增语法(2)

文章目录 1.新的类功能1.1 新的默认成员函数2. 类成员变量初始化3. 强制生成默认函数的关键字default4. 禁止生成默认函数的关键字delete:5. final与override关键字 2. 可变参数模板3. lambda表达式3.1 一个使用场景3.2 lambda表达式语法**3.3 lambda捕捉列表详细说明**3.4 **底…

一款好用的研发项目管理软件能为公司带来什么?

一款高效的研发项目管理软件可以为公司带来竞争优势&#xff0c;将项目交付时间缩短45%&#xff0c;提高项目成功率至72%&#xff0c;提高研发效率&#xff0c;缩短上市周期。该软件含有丰富的数据分析功能&#xff0c;可以更好地掌握项目进度&#xff0c;发现和解决问题&#…

Unity教程(十)Tile Palette搭建平台关卡

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

仕考网:考外省公务员可以调回本地吗?

一般情况下&#xff0c;公务员岗位是固定不可随意更换的&#xff0c;因为每个职位都对应特定的职责和要求。一旦考到外地的岗位&#xff0c;想要调回本地几乎是不可能的。因为这样的操作可能导致职位空缺&#xff0c;进而需要通过公共招聘流程来填补&#xff0c;而不是简单地从…

场外期权交易:找到适合你的那一款

各位期权爱好者们&#xff01;今天咱们来聊聊在进行场外期权交易时&#xff0c;怎么去评估和选择适合自己风险承受能力的期权产品。 第一&#xff0c;你得对自己有个清楚的认识。想想看&#xff0c;你是那种激进型的冒险家&#xff0c;还是保守型的稳健派呢&#xff1f;了解自己…

PostgreSQL数据库内核(三):缓冲区管理器

文章目录 共享缓冲区基础知识逻辑读和物理读LRU算法和CLOCK时钟算法 共享缓冲区管理器结构共享缓冲表层共享缓冲区描述符层共享缓冲页层 共享缓冲区管理器工作流程初始化缓冲区读缓冲区淘汰策略共享缓冲区锁 共享缓冲区基础知识 通常数据库系统都会在内存中预留buffer缓冲空间…

elasticsearch集成springboot详细使用

1.es下载&配置 配置JVM 配置跨域 配置https和密码 2.es启动 .\elasticsearch.bat 或 后台启动&#xff1a; nohup ./bin/elasticsearch& 浏览器访问&#xff1a;https://localhost:9200 输入账户&#xff1a;elastic / 123456 3.重置es密码 .\elasticsearch-r…

C:指针和数组之间的关系-学习笔记

目录 闲话&#xff1a; 引言&#xff1a; 1、数组名的理解 2、指针访问数组 3、一维数组传参的本质 4、二级指针 5、指针数组 6、指针数组模拟二维数组 结语&#xff1a; 闲话&#xff1a; 指针这个模块更新的比较慢&#xff0c;主要是小编还得学习指针的知识点&#…

ubuntu18.04 设置静态地址

修改配置文件 sudo vim /etc/netplan/01-network-manager-all.yaml 代码如下&#xff1a; network: version: 2 renderer: NetworkManager ethernets: ens33: # 配置的网卡名称&#xff0c;可以使用ifconfig -a查看本机的网卡 dhcp4: no # 关闭动态IP设置 …

黑神画Ⅹ--自主人工智能代理:从概念到实际应用

自主人工智能代理通过独立执行任务并做出最终决策来改变技术。与传统人工智能不同&#xff0c;它们能够分析、规划、适应并从经验中学习。机器学习和自然语言处理的进步扩大了它们在个人助理、聊天机器人、管理系统和自动驾驶汽车中的应用&#xff0c;展示了它们在各个领域的潜…

springmail发送邮件如何实现邮件动态内容?

springmail发送邮件怎么样&#xff1f;springmail发信优化方法&#xff1f; SpringMail作为一个强大的邮件发送框架&#xff0c;提供了多种方式来实现邮件内容的动态生成。AokSend将探讨如何通过SpringMail发送邮件&#xff0c;并动态生成邮件内容以满足不同的需求。 springm…

【图像去雾系列】使用SSR/MSR/MSRCR/MSRCP/automatedMSRCR算法对单图像进行图像增强,达到去雾效果

目录 一 图像去雾算法概述 二 SSR/MSR/MSRCR算法 三 实践 一 图像去雾算法概述 近些年来,出现了众多的单幅图像去雾算法,其主要可以分为 3 类:基于图像增强的去雾算法、基于图像复原的去雾算法和基于 CNN 的去雾算法。 ▲基于图像增强的去雾算法 通过图像增强技术突出图…

“泰山众筹:革新消费模式“

亲爱的伙伴们&#xff0c;是否渴望探索一种集日常消费与财富增长于一体的创新方式&#xff1f;今天&#xff0c;让我带您领略泰山众筹的魅力&#xff0c;这一革命性的消费增值理念&#xff0c;将彻底颠覆您的消费体验&#xff0c;让每一笔支出都化作通往财富之路的基石。 ✨ 泰…

了解LVS,配置LVS

项目一、LVS 1.集群Cluster Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统 LB&#xff1a;负载均衡 HA&#xff1a;高可用 HPC&#xff1a;高性能计算 2.分布式 分布式是将一个请求分成三个部分&#xff0c;按照功能拆分&#xff0c;使用微服…

MySQL的InnoDB的页里面存了些什么 --InnoDB存储梳理(三)

文章目录 创建新表页的信息新增一条数据根据页号找数据信息脚本代码py_innodb_page_info根据地址计算页号根据页号计算起始地址 主要介绍表空间索引页里面有哪些内容&#xff0c;数据在表空间文件里面是怎么组织的 创建新表页的信息 CREATE TABLE test8 (id bigint(20) NOT N…