希尔排序

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;
}

 

人工智能入门系列之一: 鸢尾花(Iris)多分类的神经网络详解及代码实现 这是最好的时代,我们一起来打造属于自动驾驶汽车上路、无人机飞天、智能机器人管工厂的AI未来 人工智能领域分化为两个阵营:其一是规则式(rule-based)方法,在人工智能早期占主峰;其二是神经网络(neural network)方法,后起之秀。随着硬件水平的提高,算力的指数式增长;人工智能的重心已经从规则式的专家时代转移到神经网络的数据时代。 “神经网络”不选择把人脑熟稔的逻辑规则传授给计算机... 阅读详情

相关推荐

国产大模型高考横评:数学推理与教育落地能力实测

大模型能力评估正从开放榜单转向封闭任务的确定性验证,高考作为强逻辑、低容错、高精度的标准化考试,成为检验模型真实推理能力的理想标尺。其核心在于考察知识覆盖、步骤完整性、单位敏感性与教学对齐度,而非单纯答案正确率。数学解答题尤其凸显模型在前提校验、条件枚举与过程可控性上的差异,反映出训练数据与教育语料深度耦合带来的工程化优势。该范式已延伸至语文语感建模、英语表达习惯适配及理综跨学科缝合等场景,为智能阅卷、精准答疑和教培系统集成提供可复现、可解释、可部署的技术依据。

weixin_30436581的博客 288

DS排序--希尔排序

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

笔记 1192

ASF-YOLO:一种基于注意尺度序列融合的细胞实例分割YOLO模型

随着样本制备技术和显微成像技术的快速发展,细胞图像的定量处理和分析在医学、细胞生物学等领域发挥着重要作用。基于卷积神经网络(CNN),可以通过神经网络训练学习不同细胞图像的特征信息,具有很强的泛化性能。两阶段的R-CNN系列[1,2,3]及其一阶段变体[4,5]是实例分割任务的经典CNN基础框架。在最近的研究中,You Only Look Once(YOLO)系列[6,7,8,9]已经成为实时实例分割中速度最快、最准确的模型之一。

m0_47867638的博客 9801

四 希尔排序

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

paynmind的博客 376

高通SA8155P车载Camera开发避坑指南:从硬件拓扑到AIS服务调试全流程

本文详细解析了高通SA8155P车载Camera开发全流程,从硬件拓扑设计到AIS(Automotive Imaging System)服务调试,涵盖关键组件配置、软件架构剖析及高级调试技巧。通过实战经验分享,帮助开发者避开常见陷阱,优化系统性能,适用于智能驾驶系统的环境感知开发。

weixin_42550597的博客 331

STM32测测速---编码电机读取速度的计算

速度计算:轮胎每转一圈的脉冲数取决于编码器的分辨率,可由下面公式进行计算:PPR是电机的线数最后可以计算轮胎每转一圈的脉冲数为:轮胎每转一圈的脉冲数 = 9.6 × 11 × 4 = 422.4最后的速度公式简化为:速度 = (0.01 秒内产生的脉冲数 ∗ 0.055 ∗ π )/(0.01 ∗422.4​。

weixin_69414084的博客 3811

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

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

weixin_39682301的博客 430

STM32+OOK通讯(OOK发送+OOK接收)+cubemx配置

关于OOK通信,我的理解就是将要发送的信息转换成高低电平(即0和1),然后接收方通过对01进行解码获得信息。于是我用了非常朴素的字符串转二进制+AM调制来完成通信链。话不多说我们直接开始!!!

qq_73856732的博客 2340

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

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

CSAPP 718

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响

本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。

weixin_29230901的博客 227

【项目实战】Java9的新特性模块化(Module)

Java 9引入了模块化系统,称为"Java Platform Module System"(JPMS)这个系统允许将Java程序分成模块,每个模块都有自己的规范,可以明确地声明它依赖于哪些其他模块,并且只能访问被其所依赖的模块暴露的API。这样可以模块化就是增加了更高级别的聚合,是Package的封装体。Package是一些类路径名字的约定,而模块是一个或多个Package组成的封装体。

奶爸的编程之路,也就一周冷个三天 1896

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

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

m0_43609475的博客 223

Android 车联网——CarAudioService介绍(六)

CarAudioService 是 Android Automotive OS 中的一个重要组件,用于管理车辆中的音频功能。它是 Android Auto 的一部分,负责处理车辆音频的播放、控制和路由。CarAudioService 使用标准的 Android 组件架构,基于 Binder 通信机制,提供了一组 API,用于管理车辆音频。它包括以下主要功能:音频路由管理:CarAudioService 可以让开发者控制音频的路由,即将音频发送到不同的输出设备,例如车辆的扬声器、耳机等。

小旭的专栏 3202

希尔排序原理

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

欢迎来到阿熊的blog~~ 2271

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

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

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

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

qq_56127002的博客 5195

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

希尔排序详解

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

星空 4895

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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、付费专栏及课程。

余额充值