【排序】直接插入排序与希尔排序(图示详解哦)

news2025/3/11 6:22:39

全文目录

  • 引言
  • 直接插入排序
    • 思路
    • 实现
  • 希尔排序
    • 思路
    • 实现
  • 总结

引言

在上一篇文章中,我们实现了选择排序与堆排序,在本篇文章中将继续介绍直接插入排序与希尔排序:

直接插入排序与希尔排序都属于插入排序的一种:
这两种排序的思想都是从待排序的部分中依次取出元素,插入到它前面的已排序部分中的合适位置。迭代,使整个数组有序。

直接插入排序

思路

直接插入排序的思路与上述思想基本一致:
即最开始时,待排序部分为整个数组,从中依次取元素,插入到该元素前面有序部分中的合适位置。然后迭代,待排序部分递减,最终实现排序整个数组。

实现

这样的思路,明显是需要两层循环的:
内层循环即单趟排序:每趟排序中,需要实现将待排序部分起始位置的元素放到该元素前面部分中的正确位置,即将这个元素与前面的元素依次比较,然后将其放在第一个小于它的元素的后面。由于每次插入时总是将该元素放在前面的正确位置,所以前面的部分总是有序的;
外层循环即需要几趟循环:控制待排序部分的元素个数,即从数组的长度开始,递减到零为止。外层循环结束后,即排序完成:

在这里插入图片描述

//直接插入排序
void InsertSort(int* a, int n)
{
	int i = 0;
	for (i = 1; i < n; i++)
	{
		int temp = a[i];
		int end = i - 1;
		while(end>=0)
		{
			if (temp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = temp;
	}
}

希尔排序

思路

希尔排序其实是直接插入排序的一种优化:
结合前面的直接插入排序,我们发现:
当排序的数据量较大时,要将一个很小的元素从数组的后面移动到前面时,要消耗的时间就会多很多;
当一组数据中部分有序时,待排序部分的首元素可以之际插入到升序部分的末尾,直接插入排序的效率就会高很多。

与直接插入排序的区别是,将数组分为多个范围相等的部分,每个部分有gap个元素。对每个部分中相同位置的元素进行直接插入排序,就可以实现将在数组后面的元素快速移动到数组的前面,即只用移动原本的n/gap次,并且还会得到一个相对有序的数组,再次提高了效率:

实现

根据上面的思路,在实现希尔排序时,前面直接插入排序的两层循环只需要稍作改动,将与前一个元素比较改为与前面的第gap个元素比较,再在这两层循环外包一层控制gap的值的循环即可;
确认gap的值时,我们可以直接将gap的值初始化为数组的长度,每次循环gap/=2,最终gap会等于1。当gap为1,再进行内层的插入排序时,排序的就是一个基本有序的数组了,效率就会很高:

在这里插入图片描述

 //希尔排序
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap >= 1)
	{
		int i = 0;
		for (i = gap; i < n; i++)
		{
			int temp = a[i];
			int end = i - gap;
			while (end >= 0)
			{
				if (temp < a[end])
				{
					a[end + gap] = a[end];
					end-=gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = temp;
		}
		gap /= 2;
	}
}

总结

到此,关于直接插入排序与希尔排序的内容就介绍完了
接下来会继续介绍其他的排序,欢迎持续关注哦

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

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

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

相关文章

Ae:摄像机设置

Ae菜单&#xff1a;图层/摄像机设置 Camera Settings 快捷键&#xff1a;Ctrl Shift Y 新建摄像机图层时&#xff0c;首先会弹出摄像机设置 Camera Settings对话框。 经典 3D 渲染器时的摄像机设置 Cinema 4D 渲染器时的摄像机设置 类型 Type 有两种类型的摄像机供选择。 提…

空间矢量数据保存为GeoJSON、PDF等文件格式

专注系列化、高质量的R语言教程 推文索引 | 联系小编 | 付费合集 我们使用的空间矢量数据一般是Shapefile格式的&#xff0c;它在ArcGIS、R语言中都能加载&#xff0c;但是这种数据格式在使用时也有不便&#xff1a;它是由多个文件构成的&#xff0c;一般有.shp、.shx、.dbf、.…

Session和Cookie区别介绍+面试题

Session 会话&#xff1a; 对应的英文单词&#xff1a;session用户打开浏览器&#xff0c;进行一系列操作&#xff0c;然后关闭浏览器。整个过程叫做一次会话一个会话包含多次请求 session机制属于B/S结构的一部分&#xff0c;主要的作用就是为了保存会话状态。(用户登录成功后…

Spring使用注解存储和读取对象

文章目录 一、存储Bean对象配置扫描添加注解存储Bean对象注解使用范围Bean的命名五大类注解的关系为什么需要五大类注解? 二、方法注解BeanBean重命名 三、对象注入属性注入Setter注入构造方法注入Autowired 和 Resource 的区别 一、存储Bean对象 之前我们存储Bean时&#xff…

【MATLAB基础绘图第2棒】绘制柱状/饼图填充图

MATLAB绘制柱状填充图 方法1&#xff1a;hatchfill2工具1.1 案例1&#xff1a;柱状图填充1.2 案例2&#xff1a;饼图填充 方法2&#xff1a;applyhatch函数2.1 案例1&#xff1a;柱状图填充2.2 案例2&#xff1a;饼图填充 方法3&#xff1a; applyhatch_plusC函数3.1 案例1&…

分析软件及其隐藏后门实验笔记

软件后门和软件加壳是什么 软件后门可以理解为在软件中植入病毒等具有后门功能的代码&#xff0c;通过运行软件来对用户的系统造成破坏、窃取机密等。 软件加壳一种常用的方式是在二进制的程序中植入一段代码&#xff0c;在运行的时候优先取得程序的控制权&#xff0c;之后再把…

Cisco SD-WAN (Viptela) version 20.11.1 ED - 软件定义广域网

请访问原文链接&#xff1a;https://sysin.org/blog/cisco-sd-wan-20/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 支持 SASE 的架构&#xff0c;其集成了面向多云、安全、统一通信和应用优化的各种功能&#xff0c;可用于轻…

ChatGPT干掉程序员?想多了...

GPT-4才诞生没几天&#xff0c;感觉朋友圈已经被这个人工智能刷屏了&#xff0c;大家一边在感叹人工智能行业蓬勃发展的同时&#xff0c;一边又有不少人患上了AI焦虑症。 这其中&#xff0c;以程序员首当其冲。原因无他&#xff0c;只因为GPT-4的惊人的能力和不少大佬的发言。 …

4.17~4.18学习总结

网络编程 概述 1.什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输&#xff0c;计算机跟计算机之间可以通过网络进行数据传输。 2.常见的软件架构&#xff1a; B/S&#xff0c;C/S 3.通信的软件架构CS BS各有什么区别和优点…

阿里云免费使用stable diffusion三个月【ai生成图片】详细教程【保姆级】

起因 这两天关注了ai生成图片&#xff0c;尝试了mijiourney服务【比较贵没入手】&#xff0c;结果免费的没有了&#xff0c;没用上&#xff0c;换了国内的一些小程序体验了下 综合体验式是太慢了&#xff0c;而他们是基于国外开源的stable diffiusion模型开发的【可以比肩mij…

【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

一&#xff0e; 问题描述 使用华为推送服务下发IM消息时&#xff0c;下发消息请求成功且code码为80000000&#xff0c;但是手机总是收不到消息&#xff1b; 在华为推送自助分析&#xff08;Beta&#xff09;平台查看发现&#xff0c;消息发送触发了频控。 二&#xff0e; 问题…

java 快排算法详解,java 快排代码

快排是一种高效的数据结构&#xff0c;它使用一个关键字&#xff08;Key&#xff09;来表示数据元素的一个集合。也就是说&#xff0c;快排是一个有序数组&#xff0c;而这个有序数组由两个元素组成。 快排的基本思想是&#xff1a;如果数组元素的值比它前面的两个元素都大&…

记录一 :对象锁和类锁

目录 简介 通过8个案例来解释说明 案例及总结 简介 阿里规约【强制】高并发时&#xff0c;同步调用应该去考量锁的性能损耗。能用无锁数据结构&#xff0c;就不要用锁&#xff1b;能 锁区块&#xff0c;就不要锁整个方法体&#xff1b;能用对象锁&#xff0c;就不要用类锁。…

提高工作效率的宝藏网站和宝藏工具

一、好用的网站 面包多 面包多 创作者在面包多&#xff0c;通过出售课程&#xff0c;文章&#xff0c;绘画&#xff0c;创意作品&#xff0c;软件&#xff0c;电子书&#xff0c;音乐&#xff0c; 游戏&#xff0c;咨询服务&#xff0c;每月获得 数百万元 收入。 写作素材模板…

二阶段算法:R-CNN类网络

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

【Java 数据结构】ArrayList的实现和底层源码讲解

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

java day9

第九章 使用swing 9.1 创建应用程序9.1.1 创建页面9.1.2 开发框架9.1.3 创建组件&& 9.1.4 将组件加入到容器中 9.2 使用组件9.2.1 图标9.2.2 标签9.2.3 文本框9.2.4 文本区域9.2.5 可滚动窗格9.2.6 复选框和单选按钮9.2.7 组合框9.2.8 列表 9.1 创建应用程序 import j…

FPGA基于SFP光口实现10G万兆网UDP通信 10G Ethernet Subsystem替代网络PHY芯片 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案4、vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取 1、前言 目前网上的fpga实现udp基本生态如下&#xff1a; 1&#xff1a;verilog编写的udp收发器&#xff0c;但不带ping功能&#xff0c;这样的代…

The GNU nano text editor (文本编辑器)

The GNU nano text editor (文本编辑器) https://www.nano-editor.org/ GNU nano is a small and friendly text editor. 1 GNU nano The GNU nano text editor https://www.nano-editor.org/dist/latest/nano.html Source Code https://git.savannah.gnu.org/cgit/nano.gi…

EIGRP 配置,详解拓扑表,路由汇聚

1.3 EIGRP 拓扑&#xff0c;路由以及汇聚 1.3.1 实验目的 通过对 EIGRP 拓扑&#xff0c;路由以及汇聚相关实验的练习&#xff0c;掌握 EIGRP 建立拓扑信息的方式&#xff0c; 度量计算方法&#xff0c;如何调整度量&#xff0c;非等价负载均衡&#xff0c;以及 EIGRP 末节路…