【数据结构】排序(一)—— 希尔排序(思路演进版)

目录

一、常见的排序算法分类

二、常见排序算法的实现 

2.1插入排序

2.1.1基本思想

2.1.2直接插入排序

思路

step1.单趟控制

step2.总体控制 

代码实现

测试

特性总结

2.1.3 希尔排序( 缩小增量排序 )

基本思想

思路演进

🌈1.代码实现单组排序(以红色组为例)

🌈2.加入控制多组排序的代码

🌈3.对上面代码修改 ,一组一组排 改为 多组并排!!!

🌈4.最后考虑,如何控制gap?

最终代码实现

测试

特性总结

三、结语


一、常见的排序算法分类

二、常见排序算法的实现 

2.1插入排序

2.1.1基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。

 2.1.2直接插入排序

思路
step1.单趟控制

先考虑单趟排序,暂时不考虑区间到底是从哪到哪 ,先抽象为[0,end]

假设[0,end]是有序的区间 a[end+1] 插入到 [0,end]中

具体如何插入:

下标是end+1的元素依次跟[0,end]区间中的元素作比较:

end+1先跟end比 再跟 end-1比较......依次往下

如果a[end+1]<a[end] 以排升序为例子 ,那么a[end]就往后挪动 也就是往后覆盖

如果a[end+1]>a[end] ,那么就停止比较 ,a[end+1] 插入到 [0,end]中

❓思路落实到代码:

用临时变量tmp 先保存a[end+1],最终插入的位置也是a[end+1]

step2.总体控制 

接下来考虑如何控制[0,end]区间大小的变化:

执行过程描述:

初始时 区间元素个数肯定只有一个,

也就是end = 0 ,区间[0,0]有序,只有一个元素a[0],然后a[1]往里插入,

完成后,end = 1,区间[0,1]有序,有两个元素,a[2]往里插入...

直到整个数组元素都有序,排序完成。

❓思路落实到代码:

执行过程中,我们发现,end的值不断变化的,所以加入外层循环变量i控制即可!

代码实现
void InsertSort(int* a, int n)
{
	//外层循环 控制 多趟[0,end]
	for (int i = 0; i < n-1; i++)
	{
		//单趟
		//[0,end] end+1 插入 [0,end]
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			//升序
			if (tmp < a[end])
			{
				//end 往后覆盖 end+1
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}
测试

特性总结

1. 元素集合越接近有序,直接插入排序算法的时间效率越高

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1),它是一种稳定的排序算法

4. 稳定性:稳定

 2.1.3 希尔排序( 缩小增量排序 )

基本思想

希尔排序法又称缩小增量法。希尔排序法的基本思想是:

先选定一个整数gap,把待排序文件中所有记录分成多个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后,再往后依次取 间隔为gap的记录,重复上述分组和排序的工作。当gap==1时,所有记录在统一组内排好序。

思路演进

总体思路:

1、预排序:分别对每个分组进行插入排序

2、直接插入排序 :保证最终结果是有序的

先选定一个整数 ,先假设 gap = 3.  图解

🌈1.代码实现单组排序(以红色组为例)

🌈2.加入控制多组排序的代码

总体有gap组 排完红色组 接着排 蓝色组、绿色组 则需要再加入一层循环控制

j==0 红色组 插入排序

j==1 蓝色组 插入排序

j==2 绿色组 插入排序

🌈3.对上面代码修改 ,一组一组排 改为 多组并排!!!

上面代码是 : 红色组排完 排绿色组  绿色排完 排蓝色组

下面代码是 : 红色组第一个位置排好,

                        i++ 排蓝色组第一个位置 ,

                       再 i++ 排绿色组第一个位置

                       以此类推......

 实现多组并排:

🌈4.最后考虑,如何控制gap?

gap越大:小的值更快调到前面,大的值更快调到后面

gap越小:调得越慢 但 越接近有序

gap==1 :就是直接插入排序

所以我们再加入一层循环 控制gap

最终代码实现
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 2 ;
		for (int i = 0; i < n - gap; i ++)
		{
			//单趟
			//[0,end] end+gap 插入 [0,end]
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				//升序
				if (tmp < a[end])
				{
					//end 往后覆盖
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}
测试

特性总结

1. 希尔排序是对直接插入排序的优化。

2. 当gap > 1时都是预排序,目的是让数组接近于有序

    当gap == 1时,数组已经是接近有序,再进行直接插入排序,目的是让数组有序

    这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定。平均时间复杂度O(N^1.3)

三、结语

插入排序就先讲到这里,后面滴选择、交换、归并排序,都会快快更新滴~

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

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

相关文章

GD32用ST-Link出现internal command error的原因及解决方法

一、GD32 F407烧录时出现can not reset target shutting down debug session 搜寻网上资料&#xff0c;发现解决方式多种多样&#xff0c;做一个简单的总结&#xff1a; 1.工程路径包含中文名 2.需更改debug选项 3.引脚冲突 4.杜邦线太长 而先前我的工程路径包含中文名也仍…

Java Array 数组

文章目录 Java Array 数组一&#xff0c;数组的介绍1. 数组的理解(Array)2. 数组相关的概念3. 数组的特点:4. 变量按照数据类型的分类5. 数组的分类6. 一维数组的使用(6个基本点)7. 数组元素的默认初始化值的情况 二&#xff0c;一维数组1. 一维数组功能测试2. 一维数组案例(1)…

香港虚拟主机哪里可以试用?用于企业建站的

香港虚拟主机适合个人、企业建站&#xff0c;包括外贸企业网站、个人博客网站、中小企业官网等&#xff0c;那么作为新手不知道哪家香港虚拟主机好用的时候&#xff0c;该如何找到可以试用的香港虚拟主机呢&#xff1f; 香港虚拟主机也称作香港空间、香港虚拟空间&#xff0c;…

深入探索Android应用数据共享之ContentProvider

本文将深入探讨Android开发中非常重要的数据共享机制 - ContentProvider。 主要内容包括: ContentProvider的基本定义及特点如何实现一个自定义的ContentProviderContentProvider对外提供的功能以及对外部应用的权限控制对ContentProvider的一些常见使用场景使用ContentProvi…

linux_用户与组

用户与组 基于账号的访问控制 账号类型&#xff1a;用户账号(UID) 、组账号(GID) 用户账号简介 作用: 1.可以登陆操作系统 2.不同的用户具备不同的权限 唯一标识&#xff1a;UID&#xff08;编号从0开始的编号&#xff0c;默认最大60000&#xff09; 管理员root的UID&…

简单贪吃蛇的实现

贪吃蛇的实现是再windows控制台上实现的&#xff0c;需要win32 API的知识 Win32 API-CSDN博客https://blog.csdn.net/bkmoo/article/details/138698452?spm1001.2014.3001.5501 游戏说明 ●地图的构建 ●蛇身的移动&#xff08;使用↑ . ↓ . ← . → 分别控制蛇的移动&am…

哈希(构造哈希函数)

哈希 哈希也可以叫散列 画一个哈希表 哈希冲突越多&#xff0c;哈希表效率越低。 闭散列开放定址法: 1.线性探测&#xff0c;依次往后去找下一个空位置。 2.二次探测&#xff0c;按2次方往后找空位置。 #pragma once #include<vector> #include<iostream> #i…

基于SpringBoot+Vue的物流管理系统

运行截图 获取方式 Gitee仓库

机器学习(五) ----------决策树算法

目录 1 核心思想 2 决策树算法主要步骤 3 决策树算法的分类 3.1 ID3算法&#xff08;Iterative Dichotomiser 3&#xff09;&#xff1a; 3.1.1 基本步骤 3.1.2 原理 信息增益 3.1.3 注意事项 3.2 C4.5算法&#xff1a; 3.2.1. 信息增益率 计算公式 3.2.2. 构建决策…

Rpcx (一):详解【介绍、基础示例 demo】

一.rpcx介绍 1.1 rpc是什么 远程过程调用的通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。简单地说就是能使应用像调用本地…

服装店会员管理系统结合小程序商城帮你挖掘出潜在客户

在现代社会&#xff0c;随着科技的不断进步和人们消费习惯的变化&#xff0c;传统的服装店已经不再能够满足消费者的需求。为了更好地服务客户&#xff0c;提升销售业绩&#xff0c;许多服装店开始引入会员管理系统&#xff0c;并结合小程序商城&#xff0c;实现线上线下的无缝…

【半夜学习MySQL】表的约束(含主键、唯一键、外键、zerofill、列描述、默认值、空属性详解)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 前言空属性默认值列描述zerofill主键主键概述主键删除与追加复合主键 自增长唯一键外键综合案例 前言 上一篇文章中介绍了数…

Android性能:高版本Android关闭硬件加速GPU渲染滑动卡顿掉帧

Android性能&#xff1a;高版本Android关闭硬件加速GPU渲染滑动卡顿掉帧 如果在Androidmanifest.xml配置&#xff1a; <application android:hardwareAccelerated"false" > 或者某个特点View使用代码&#xff1a; myView.setLayerType(View.LAYER_TYPE_SOFT…

带你手撕红黑树! c++实现 带源码

目录 一、概念 二、特性 三、接口实现 1、插入 情况一&#xff1a;p为黑&#xff0c;结束 情况二&#xff1a;p为红 1&#xff09;叔叔存在且为红色 2&#xff09;u不存在/u存在且为黑色 &#xff08;1&#xff09;p在左&#xff0c;u在右 &#xff08;2&#xff09;…

爱分析基于杭州云器Lakehouse实现成本最优的一体化管理,新一代数据平台的建设方式

导读 1.当前&#xff0c;企业在大数据和数据中台建设上取得成果&#xff0c;但数据开发管理仍具挑战性&#xff08;成本、效率、复杂度&#xff09;。 2.随数据平台领域成熟&#xff0c;厂商应结合自身需求&#xff0c;重新思考“基于开源自建数据平台”的重资产模式与“购买…

Windows单机部署RocketMQ5.X并与SpringBoot集成

RocketMQ 5.X下载 《RocketMQ 5.X下载》 下载后&#xff0c;解压缩 修改初始内存 修改runserver.cmd&#xff08;Linux则为runserver.sh&#xff09; 将下面的-Xms2g -Xmx2g -Xmn1g调小 if %JAVA_MAJOR_VERSION% lss 17 (set "JAVA_OPT%JAVA_OPT% -server -Xms2g -X…

传感网应用开发教程--AT指令访问新大陆云平台(ESP8266模块+物联网云+TCP)

实现目标 1、熟悉AT指令 2、熟悉新大陆云平台新建项目 3、具体目标&#xff1a;&#xff08;1&#xff09;注册新大陆云平台&#xff1b;&#xff08;2&#xff09;新建一个联网方案为WIFI的项目&#xff1b;&#xff08;3&#xff09;ESP8266模块&#xff0c;通过AT指令访问…

计算机毕业设计python校园二手交易系统aqj3i-

什么叫三层架构呢&#xff1f;指的是表示层、组件层、数据访问层。组件层是双层架构没有的&#xff0c;它的加入&#xff0c;把复杂的问题分解得更简单、明了&#xff0c;通过组件层&#xff0c;实现控制数据访问层&#xff0c;这样达到功能模块易于管理、易于访问等目的&#…

【python量化交易】qteasy使用教程06——创建自定义因子选股交易策略

创建自定义因子选股策略 使用qteasy创建自定义因子选股交易策略开始前的准备工作本节的目标Alpha选股策略的选股思想计算选股指标用FactorSorter定义Alpha选股策略交易策略的回测结果用GeneralStg定义一个Alpha选股策略回测结果&#xff1a;本节回顾 使用qteasy创建自定义因子选…

【UnityRPG游戏制作】Unity_RPG项目_PureMVC框架应用

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…