希尔排序

C++ 希尔排序 希尔排序的原理: (1)首先,从数组的首元素开始每隔“步长(间隔)”个元素就挑选一个元素出来作为子数组元素。 (2)然后每个子数组各自进行比较,比较好后,每个子数组都有顺序,进入下一轮,步长(间隔)减少, 再根据步长(间隔)分组进行比较。 (3)重复以上操作,最后就有顺序了。 #include <iostream> #include <stdlib.... 阅读详情

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。

基本思想

  希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

  简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。

  我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。

#include<iostream>
#include<algorithm>

using namespace std;

void OutNum(int *nNum, size_t len)
{
	// 异常处理
	if (nNum == NULL)
		return;

	for (size_t i = 0; i < len; i++)
		cout << nNum[i] << ' ';
	cout << endl;
}


void ShellSort(int* nNum, int nLen)
{
	// 异常处理
	if (NULL == nNum)
		return;

	// 增量初始化为nLen / 2,按希尔增量方式递减
	for (int nGap = nLen / 2; nGap > 0; nGap /= 2)
	{
		for (int nGapCur = 0; nGapCur < nGap; nGapCur++)
		{
			// 每组进行简单插入排序
			for (int i = nGap + nGapCur; i < nLen; i += nGap) {
				int nKey = nNum[i];

				//代表已经排过序的元素最后一个索引数
				int j = i - nGap;
				while (j >= 0 && nKey < nNum[j]) {
					//从后向前逐个比较已经排序过数组,如果比它小,则把后者用前者代替,
					//其实说白了就是数组逐个后移动一位,为找到合适的位置时候便于Key的插入
					nNum[j + nGap] = nNum[j];
					j -= nGap;
				}
				//找到合适的位置了,赋值,在i索引的后面设置key值。
				nNum[j + nGap] = nKey;
			}

		}
	}
}

int main()
{
	int nNum[10] = { 1,7,4,5,3,8,6,9,0,2 };
	//	int nNum[20] = {0,1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9};
	//int nNum[20] = { 5,0,-8,2,3,4,7,-7,8,1,10,-2,-3,-4,6,-5,-6,9,-9,-1 };

	ShellSort(nNum, 10);
	//ShellSort(nNum, 20);

	OutNum(nNum, 10);
	//OutNum(nNum, 20);
	return 0;
}

 

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集) 本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。 阅读详情

相关推荐

微信中调起支付宝支付

微信中调用支付宝支付,首先我们知道微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行网页支付或打开app支付。以下为详细唤起支付宝的步骤、业务代码以及相关页面图。 如有问题欢迎评论留言,看到定回复哦^_^\(^o^)/~ 一、微信中唤起支付宝,有几个步骤: 1、中间页引导用户在浏览器中打开去唤起支付宝。 2、浏览器中打开支付宝或app中打开支付宝。 3...

han_calligrapher的博客 2万+

DS排序--希尔排序

希尔排序的基本思想是:先将整个待排序列分割成若干子序列分别进行直接插入排序,将序列变成基本有序序列后,再进行对整体进行一次直接插入排序,又称为缩小增量排序。直接插入排序时间复杂度为O(n²),如果待排序的序列已经有序,则时间复杂度提高到O(n)。对每组测试数据,输出每趟排序结果。第三行输入n个数据,都是正整数,数据之间用空格隔开。给出一个数据序列,使用希尔排序算法进行降序排序。第二行输入n,表示第一个示例有n个数据(n>1)间隔gap使用序列长度循环除2直到1。第一行输入t,表示有t个测试示例。

笔记 1192

altium room 布局_ALtium 16相同重复模块PCB布局,复制布局走线

自己做了实际工程以后发现PCB器件名字后缀太长了,所以文章最后写了一下后缀的调整方法。第一种方法:1、建立子原理图如下,文件名CANM 2、之后新建一个顶层文件,文件名TOP,之后design—create sheet symbol form sheet or hdl。选择CANM,并放置到TOP中,如下 3、由于我们要多次调用CANM所以使用repeat命令修改如下: 4、之后根据自己的定义,连...

weixin_39609573的博客 5751

四 希尔排序

此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。 1. 概述: 希尔排序是一种基于插入排序的快速的排序算法,对于大规模乱序数组插入排序很慢,因为它之后交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另外一端。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。 2. 算法: 希尔排序的思想是使数组中任意间隔为 h 的元素都是有序的,这样的数组被称为 h 有序数组。在进行排序的时候,如果 h 很大,我们就能将元素

paynmind的博客 376

tewa-707e光猫超级密码获取方法

这款光猫很魔性,没有WIFI,没有USB接口,没有Telnet,试了很多方法去获取超级密码都不行。解密时可能会报错,可能是文件后面部分不晓得是咋拼接过来的,用AES解密时分组数据有问题。3、这个文件是用AES加密了的,直接打开是乱码,所以得用AES解密,key为16个字节的 x00。打开解出来的文件,然后搜索 telecomadmin,就可以发现超级密码了。参考资料里面的光猫不是同一款,但解密的方法基本相同的。

shaowl111的专栏 1万+

大数据数据埋点技术面试题及参考答案(持续更新)

事件:指的是用户执行的具体动作,如页面浏览、按钮点击、商品购买等。事件是触发数据记录的直接原因,是分析用户行为的关键点。属性:是与事件相关的额外信息,可以提供关于事件的更多上下文。例如,用户点击的按钮颜色、大小、页面位置等。属性有助于更细致地分析用户行为,理解事件发生的具体情境。事件和属性共同构成了数据埋点的数据模型,它们使得收集的数据具有可分析性,从而可以用于深入理解用户行为和优化产品。

大模型大数据攻城狮的专栏 2097

希尔排序是一种稳定的排序算法_排序算法 - 希尔排序分析及优化

希尔排序1 算法思想希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本。在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是因为待插入元素局部非常无序,比如说[2, 3, 4, 5, 6, 7, 8, 1, ...],我们要插入1,就必须将1和前面的2-8每个值都比较一下,就是因为1附近非常无序,想象一下,如果待插入元素附近比较...

weixin_39682301的博客 430

这才是 Python 的正确玩法!用强化学习 (RL) 训练 AI 玩《王者荣耀》,胜率 90%!

大家打排位时,一定遇到过那种“意识神级、操作零失误”的对手,或者“走位呆滞、送人头”的队友。以前的“人机”是程序员写死的脚本(If 血量<20% Then 回城)。而现在的顶级 AI(如腾讯绝悟、OpenAI Five),是靠强化学习 (Reinforcement Learning)自己“左右互搏”练出来的。今天,我们不谈枯燥的数学公式,我将手把手教你用,搭建一个能玩 MOBA 游戏的 AI Agent。即使不能去 KPL 打职业,虐一下钻石局还是绰绰有余的!

BUG猿的博客 1182

图解排序算法(二)之希尔排序 【转载-挺棒的】2020-11-20

图解排序算法(二)之希尔排序   希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。 基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。   简单插入排

CSAPP 718

C# 上位机程序中的数据采集与存储技术:从采集到持久化的完整解决方案

本文系统讲解C#上位机程序如何实现设备数据采集与持久化。主要内容包括:1)多种数据采集方式(串口通信、Modbus、OPC等)及代码示例;2)详细对比不同存储技术(CSV、SQLite、关系型数据库等)的优缺点;3)提供SQLite等存储实现代码;4)推荐分层系统架构(采集-缓存-存储-可视化);5)性能优化建议(多线程采集、异步存储、批量写入等)。文章强调应根据项目需求选择合适的技术方案,构建高效稳定的数据采集存储闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1025

模型瘦身术:YOLOv5无损剪枝实战教程

本文介绍了一种YOLOv5模型的无损剪枝方法,通过"稀疏训练+结构化剪枝+微调"的流程,在不损失精度的前提下显著减小模型尺寸并提升推理速度。具体步骤包括:1)稀疏训练给参数排优先级;2)裁剪不重要通道;3)微调恢复精度;4)验证效果。实战部分详细展示了从环境搭建到剪枝实现的完整流程,并分析了剪枝后在边缘设备部署、实时检测等场景的优势。该方法可使YOLOv5s模型从14MB缩减至2-3MB,推理速度提升30%-50%,适用于资源受限设备的轻量化部署需求。

LXY_LOVE36的博客 104

数据结构笔记(三十五)--排序概念

排序概念 排序算法,还分为内部排序算法和外部排序算法,之间的区别是,前者在内存中完成排序,而后者则需要借助外部存储器。 排序算法有: 1. 插入排序算法 2. 折半插入排序算法 3. 2路插入排序算法 4. 表插入排序算法 5. 希尔排序算法(缩小增量排序) 6. 冒泡排序(起泡排序)算法 7. 快速排序(QSort,快排)算法 8. 简单选择排序算法 9. 树形选择排序(锦标赛排序) 10. 堆排序算法 11. 归并排序算法 12. 基数排序算法 13. 内部排序算法的优势分析 ...

m0_43609475的博客 223

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6487

希尔排序原理

3、其实预排序的实现和直接插入排序的过程几乎是完全相似,前面也说了当希尔排序的缩小增量为1时,和插入排序没区别,也就是说,插入排序每次都对相邻的数据处理,而希尔排序是将分好的组看成新的数组,例如上面数据的6, 2, 3为一组,我们可以看成其他的数据不存在,只有这一组存在,那么对于这一组而言,希尔排序就是插入排序,将上图的三组都排完序,这一趟预排序就算完成了。2、已排序区数组元素加一,待排序区首元素变为3,end也变为3的下标,tmp记录此元素的值,将tmp与已排序区元素进行比较,首先与5比较,小于5。

欢迎来到阿熊的blog~~ 2271

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java希尔排序(含希尔排序代码)

希尔排序原理 希尔排序为啥比插入排序效率高 希尔排序的代码详解

qq_56127002的博客 5195

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

希尔排序详解

八大排序算法中,有两种插入排序,直接插入排序和希尔排序,下面我们来介绍希尔排序。 希尔排序 希尔排序又叫做缩小增量排序。 1、基本思想 设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和...

星空 4895

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java实现希尔排序

1 问题描述 给定一组数据,请使用希尔排序获取这组数据的非降序序列。 2 解决方案 2.1 希尔排序原理简介 希尔排序的实质...

5502

希尔排序增量怎么确定_排序算法之希尔排序

本文将介绍排序算法中的希尔排序,它是高级版的插入排序,是我们第一个介绍的有点难度的算法。1 实例讲解希尔排序,是插入排序的一个升级版本。在插入排序中,无论数据是怎么分布的,依然循规蹈矩的一步一步比较,移动,插入。在希尔排序中,采用跳跃式的方式,按照某个增量gap将数组元素分成多组序列,并使用插入排序使得各自组内有序。随后逐步缩小gap,继续按组进行插入排序,直到增量为1。这样做的目的是使得数组整体...

weixin_39955925的博客 2745

希尔排序的理解

0.思考 相比于直接插入排序和折半插入排序,有没有可以继续提高效率的方法? 将要移动的元素移动一大步,即让它离排序完成后的最终位置更近一些。 想办法让我们在直接插入排序的时候,使得序列基本有序、个数较少并且当比较一次时,移动一大步,这就是希尔排序思想的出发点。 1.希尔排序 1.1希尔排序的基本思想 先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中...

neverthe的博客 2037

排序之希尔排序

希尔排序思想 希尔排序对要排序的数字进行分组,在组内进行排序。排序完成需要进行多次分组,每次分组的个数是前一次分组个数的一半。 图示 以 [3290615487] 该数组为例从小到大进行排序。 1. 首先将该组数字进行分组,首次分组的个数为数组长度除以2,即 10 / 2 = 5 组,下面相同颜色的为一组(即同一组内数字之间的下标的距离为组的个数)...

Coding的博客 930
上一篇: 直接插入排序
下一篇: 选择排序
Maybe______
博客等级 码龄10年 26粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值