排序——希尔排序、插入排序

本节复习排序中的希尔排序,希尔排序属于插入排序。 希尔排序的代码和插入排序非常类似。 思想却相对于插入排序来说复杂。 

在复习希尔排序之前, 我们需要先复习一下插入排序。

目录

插入排序

插入过程

代码实现

希尔排序

希尔排序的思想

代码实现 


插入排序

插入过程

插入排序的思想就是寻找向数组的前面遍历寻找适合的空位。 然后插入进去。 

如图这几个数据。 

插入排序排升序的过程就是:

首先,红指针指向第二个元素。 黑指针指向第一个元素。 然后看黑指针指向的数据是否小于红指针。 小于的话就将红指针的数据放到黑指针的位置。 黑指针所指向以及之后的数据向后覆盖。 如果黑指针越界也没有找到。 那么红指针指向数据就放到第一个位置。 

5放到第一个位置, 9向后覆盖。如图: 

继续:

 红指针向后移动一位。 黑指针继续指向红指针前面的一位。 

 

找不到, 将2放到第一个位置。 5和9向后覆盖如图:

然后红指针重新向后移动一位,黑指针重新指向红指针前一个位置。

 向前找

找到了, 然后将4放到黑指针指向位置。 2, 5, 9, 向后覆盖: 

然后红指针向后移动一位, 黑指针指向其前一个位置。 循环往复。 这里就不画了。

插入排序就是这么一个过程。 现在我们来实现一下代码: 

代码实现


//插入排序
void InsertSort(int* a, int sz)//插入排序,n^2里面最优的一个 
{
	//[0, end], 有序,插入一个tmp值, 依旧保持串数列有序, 如何插入。 

	for (int i = 1; i < sz; i++) 
	{
		int end = i - 1;//让end指向已有序的最后一个数字。 
		int tmp = a[i];//让将end后面的那个待排序的数字赋值给tmp。

		while (end >= 0) //让end一步一步向后走, 到end == 0位置
		{
			if (tmp < a[end]) //看一下tmp和a[end]哪个比较大, 如果tmp的值小, 那么说明待排序的那个数字应该在第end以前的位置
				//第end个数字以后已排序的数字, 整体向后移动一位。
			{
				a[end + 1] = a[end];//让第end位置的数字向后覆盖一位。
				end--;//end位置的数字向后移动一位的同时, end--, 继续检查下一个数字。 
			}
			else//一直到第tmp 大于 第end位置的数字, 说明tmp应该就是第end + 1位置的数字。 而此时第end + 1和第 end + 2可能
				//是同一个数字或者tmp刚刚开始检查, 没有向后检查呢就检查出错误。
			{
				//为什么不在这里直接进行插入, 是因为可能找到最后一个数也没有找到要排序的位置。
				//那么这一个位置就只能覆盖成别的数字。 
				break;
			}
		}

		a[end + 1] = tmp;//放在这里就解决了到end == 0的时候也没有找到比tmp小的数字的位置。 

	}


}

插入排序实现后理解希尔排序就相对简单一些。 现在来看希尔排序:

希尔排序

希尔排序的思想

希尔排序的思想就是将数组分为几组。 

如图分成三组。 然后对第一组的第一个数和第二组的第一个数和第三组的第一个数进行插入排序。

第一组的第二个数, 第二组的第二个数, 第三组的第三个数进行插入排序

第一组的第三个数, 第二组的第三个数, 第三组的第三个数进行插入排序。

然后分组的大小减小,再次进行这样的排序, 直到每组大小减小到1如图:

再次进行最后一轮插入排序。 整个数组就成为了有序。 这个过程就是希尔排序。 

代码实现 


//希尔排序
void ShellSort(int* a, int sz) 
{
	int gap = sz / 2;//先让gap为二分之待排序数组长度, 然后每次子插入排序都让gap除以2.

	while (gap > 1) //gap最小为2的时候就能让数组变的有序。 所以gap > 1是为了保证gap会成为最小的那个2.并且不会做多余的排序
	{
		gap = gap / 2;//gap在每次子插入排序中都除以2.
		for (int i = gap; i < sz; i++) //让i 从gap开始, 因为对于一个希尔排序, 每gap个数字可以看成一个数字。 
			//因为每组内对应位置的数字都会和其他gap组合内的其他数字进行子插入排序。 
		{
			int end = i - gap;//gap为一组, gap看成一个数字。
			int tmp = a[end + gap];//gap为一组, gap看成一个数字,
			//例如, 第一个gap内第一个数字和第二个gap内第一个数字会进行插入排序。
			while (end >= 0) 
			{
				if (tmp < a[end]) //这里不好想像, 其实就是寻找一个合适的待排序的数字的位置。 这个数字碰到比他大的
					//end就向前移动一位。 然后和前一个数字比较。
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else 
				{
					break;
				}
			}
			a[end + gap] = tmp;//这里和插入排序相同

		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新零售SaaS架构:订单履约系统架构设计(万字图文总结)

什么是订单履约系统&#xff1f; 订单履约系统用来管理从接收客户订单到将商品送达客户手中的全过程。 它连接了上游交易&#xff08;客户在销售平台下单环&#xff09;和下游仓储配送&#xff08;如库存管理、物流配送&#xff09;&#xff0c;确保信息流顺畅、操作协同&…

0201安装报错-hbase-大数据学习

1 基础环境简介 linux系统&#xff1a;centos&#xff0c;前置安装&#xff1a;jdk、hadoop、zookeeper&#xff0c;版本如下 软件版本描述centos7linux系统发行版jdk1.8java开发工具集hadoop2.10.0大数据生态基础组件zookeeper3.5.7分布式应用程序协调服务hbase2.4.11分布式…

算法刷题Day3 | 203.移除链表元素、707.设计链表、206.反转链表

目录 0 容易被大家忽略的问题1 移除链表元素1.1 开始的错误解题1.2 头结点和头指针的区别1.2.1 区别1.2.2 思考 1.3 正确的题解1.3.1 直接移除法1.3.2 添加虚拟头节点辅助移除法1.3.3 总结 2 设计链表2.1 我的解题 3 反转链表3.1 我的解题3.2 其他方法&#xff08;双指针法、递…

【硬件工程师面经整理24_其它】

文章目录 1 功放线性指标调试方法2 功放线性指标之间的关系3 光衰减器的原理4 材料硬度由什么决定&#xff1f;5 晶振市场失效率&#xff1f;6 原码、反码和补码 1 功放线性指标调试方法 调试功放线性指标的方法可以根据具体的情况和要求而有所不同&#xff0c;以下是一般性的…

房屋租赁系统|基于 Mysql+Java+JSP技术的房屋租赁系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 管理员功能 租户功能 房屋租赁系统结构图 数据库设计 lunwen参考 概述 源码获取 文末获取源码 前台首页功能 管理员功能 租户功能 房屋租赁系统结构图 数据库设计 lunwen参考 概述 随着科学技术的飞速发展&#xff0c;社会的方方面面…

荔枝派zero驱动开发06:GPIO操作(platform框架)

参考&#xff1a; 正点原子Linux第五十四章 platform设备驱动实验 一张图掌握 Linux platform 平台设备驱动框架 上一篇&#xff1a;荔枝派zero驱动开发05&#xff1a;GPIO操作&#xff08;使用GPIO子系统&#xff09; 下一篇&#xff1a;更新中… 概述 platform是一种分层思…

Mac测试环境搭建

1 下载pycharm 下载地址&#xff1a;PyCharm&#xff1a;JetBrains 出品的用于数据科学和 Web 开发的 Python IDE 2 安装python3.6.8 下载地址&#xff1a;Index of /ftp/python/3.6.8/ 安装后提示错误 换一种方式&#xff1a;用conda 下载地址&#xff1a;Free Download | …

实现QT中qDebug()的日志重定向

背景&#xff1a; 在项目开发过程中&#xff0c;为了方便分析和排查问题&#xff0c;我们需要将原本输出到控制台的调试信息写入日志文件&#xff0c;进行持久化存储&#xff0c;还可以实现日志分级等。 日志输出格式&#xff1a; 我们需要的格式包括以下内容&#xff1a; 1.…

鸡肋的Git

1.前言 对于大多数开发人员来说&#xff0c;我们大多数在学习或者工作过程中只关注核心部分&#xff0c;比如说学习Java&#xff0c;可能对于大多数人而言一开始都是从Java基础学起&#xff0c;然后408&#xff0c;Spring&#xff0c;中间件等&#xff0c;当你发现很多高深的技…

红队专题-开源漏扫-巡风xunfeng源码剖析与应用

开源漏扫-巡风xunfeng 介绍主体两部分:网络资产识别引擎,漏洞检测引擎。代码赏析插件编写JSON标示符Python脚本此外系统内嵌了辅助验证功能文件结构功能 模块添加IP三. 进行扫描在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/de587a6f6f694…

html前端的几种加密/解密方式

HTML前端的加密解密方式有以下几种&#xff1a; 一、base64加密 Base64编码&#xff1a;Base64是一种将二进制数据转换为可打印字符的编码方式。在前端&#xff0c;可以使用JavaScript的btoa()函数进行Base64编码&#xff0c;使用atob()函数进行解码。 var str "hello…

二维码门楼牌管理系统在教育领域的应用及其优势

文章目录 前言一、二维码门楼牌管理系统概述二、教育领域的应用场景三、二维码门楼牌管理系统的优势四、结语 前言 随着信息技术的快速发展&#xff0c;二维码门楼牌管理系统在教育领域的应用越来越广泛。该系统不仅提高了地址信息的准确性&#xff0c;还为学校、家长和教育工…

Feign实现微服务间远程调用续;基于Redis实现消息队列用于延迟任务的处理,Redis分布式锁的实现;(黑马头条Day05)

目录 延迟任务和定时任务 使用Redis设计延迟队列原理 点评项目中选用list和zset两种数据结构进行实现 如何缓解Redis内存的压力同时保证Redis中任务能够被正确消费不丢失 系统流程设计 使用Feign实现微服务间的任务消费以及文章自动审核 系统微服务功能介绍 提交文章-&g…

C#,数值计算,解微分方程的龙格-库塔四阶方法与源代码

Carl Runge Martin Wilhelm Kutta 1 龙格-库塔四阶方法 数值分析中&#xff0c;龙格&#xff0d;库塔法&#xff08;Runge-Kutta&#xff09;是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔龙格和马丁威尔海姆库塔于1900年左右发明。 对于一阶…

[Electron]中IPC进程间通信

Electron中IPC 进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。在 Electron 中&#xff0c;进程使用 ipcMain 和 ipcRenderer 模块&#xff0c;通过开发人员定义的“通道”传递消息来进行通信。 本文介绍以下几个方面&#xff1a; 1-渲染进程到…

【vue.js】文档解读【day 3】 | 列表渲染

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 列表渲染v-forv-for 与对象在 v-for 里使用范围值template 上的 v-forv-for与v-if通过key管理状态组件上使用v-for数组变化侦测 列表渲染 v-for 在我们想要渲染出一个数组中的元素时&#xf…

【C语言】数据类型和变量

前言&#x1f49e;&#x1f49e; 啦啦啦~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;C语言笔记 &#x1f4a5;欢迎大家&#x1f973;&#x1f973;点赞✨收藏&#x1f49…

linux网络编程(概念)

概念 通信四元组 IP&#xff08;主机&#xff09; 0号地址与1号地址 端口&#xff08;进程&#xff09; 四元组组成 各种体系结构 网络的封包和解包 ip地址向物理&#xff08;mac&#xff09;地址转换 mac转换ip-------->RARP协议 TCP协议 UDP协议 socket函数接口

瑞_23种设计模式_模板方法模式

文章目录 1 模板方法模式&#xff08;Template Pattern&#xff09; ★ 钩子函数1.1 介绍1.2 概述1.3 模板方法模式的结构1.4 模板方法模式的优缺点1.5 模板方法模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;InputStre…

java项目线上捉BUG经验记录

一 线上问题 昨晚上突然接到公司紧急来电电桩设备大面积离线&#xff0c;意味着某市的车无法充电……”&#xff0c;细想这个平台很久都没有更新&#xff0c;最近出现问题是刚好在一个月前也是出现这种情况&#xff0c;再上一次就是几年前更新的。平台平时是稳定&#xff0c;开…