当前位置: 首页 > news >正文

【排序算法】希尔排序

前言:学习希尔排序前最好先掌握插入排序,在进行;不会的可以点击——>【排序算法】插入排序-CSDN博客

一、希尔排序:

        希尔排序,也称为缩小增量排序,是一种基于插入排序的快速改进算法。由Donald Shell于1959年提出。 它的基本思想是将待排序元素按照一定的增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序在一般用于处理大量数据!!

二、思路:

分成2个阶段:

1、预排序:这个阶段将待排序的数据分成gap组,对每组数据进行插入排序。

2、插入排序:gap==1时,也就是只有1组的情况,这个数组就变成有序数组了。

 具体详情:

1、将一个小于n(元素个数的)的整数作为gap增量,所有距离为gap的元素作为一组数据(也就是我们说的将数组分成gap组)然后对每一组数据进行插入排序,排好后,取一个比第一增量小的整数(比原gap小的组数)重新将新的gap距离的元素作为一组数据,接着上述操作;重复这些操作

2、当gap不断细分到了gap==1即将所有元素分为一组时,进行插入排序,数据变成有序!

下面的动图,我觉的比较直观的了?当然没看懂也没关系,下面会有讲解


 先分组,然后你会发现我们分了三组,我们以3个元素为一组分的,但是有的组元素个数未满三个,因为元素之间的距离和数组长度的差异,会有点不同,但是影响不大哈,值得注意的是距离差3不是元素个数差3哈,个数是只差了2个元素,从图里也可以看出来

分为3个组:

第一组:8、7、5

第二组:9、2、4

第三组:1、3

 对第一组进行插入排序

 然后接下来是下标为0+gap+gap的位置来一次插入排序,该位置本来的元素是5,经过插入排序后,5到了这组数据的最前面;此时这一组的数据是不是变成有序

当每组都进行完插入排序后,我们可以发现小的数几乎靠近左边,大的数几乎靠近右边。大致粗略有点顺序了 

 然后将gap==1,进行一次整体的插入排序;因为数据比较少 所以这里gap的分化次数也比较少


三、时间复杂度:(有点难证明,记住即可)

O(N^1.3)

四、实现:

先考虑一组的实现哈。发现了没?其实和插入排序实现很相似,如果gap==1就是插入排序了。


对每一组都要进行插入;发现了么,先写底层逻辑真的很清晰;我们会顺畅很多

但是我不想要三层循环嵌套,可以修改一下,之前是一组一组的进行,就是说排好一组在进行另一组。现在我直接交错进行,先第一组的第一个元素,然后第二组的第一个元素,然后第三组的第一个元素,再是第一组的第二个元素……

下标到最后一组倒数第二个元素的位置即可,因为我们是将end的下一个元素抽出来,注意不要越界访问

最后要完成gap的变化,gap不是一直不变的,会不断地变小,直到gap==1;也就是第二个阶段:对整个数组进行插入排序,所以gap是个变值

 整体代码:

void ShellSort(int* a, int n)
{int gap = n;//gap的组数越大,数据可以更快的跳到后面,小的更快跳到前面,但是越不接近有序;反之,gap越接近有序while (gap > 1){//巧妙的用的除法,/2 /3 /4都行,但是有人证明了/3更好,还要加1,因为gap小于3的话gap/3==0//最后一次gap一定是1,也就是插入排序,数据变成有序的呢!!!gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){//分组int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}}

 gap的选取:

        gap刚开始时从每组3个数据开始进行分组插入排序,然后gap=gap/3+1不断地分化组数(分的组数在减少,但是相反的每组数据个数在增加)加一个 1 是为了保证最后一次满足gap==1,因为gap/3 gap小于3时得到的商只能是0;并不是只能gap/3,也可以gap/2等等,但是目前gap/3+1是时间复杂度被验证过了的

分组组数的特点:

gap越大,每一组的数据间隔越大(中间隔的元素个数多),插入一次的幅度更大,大的数据能够更快的跳到后面,小的数据也能更快的跳到前面,但是越远离有序

gep越小,每组数据间隔越小(中间隔的元素个数少),此时数据跳到后面也就越慢,小的数据跳到前面也越慢;但是越接近有序,即gap==1时就是有序的

感                       谢                 观                 看 

相关文章:

【排序算法】希尔排序

前言&#xff1a;学习希尔排序前最好先掌握插入排序&#xff0c;在进行&#xff1b;不会的可以点击——>【排序算法】插入排序-CSDN博客 一、希尔排序&#xff1a; 希尔排序&#xff0c;也称为缩小增量排序&#xff0c;是一种基于插入排序的快速改进算法。由Donald Shell于1…...

数学建模--LaTex插入表格详细介绍

目录 1.插入普通的边线表格 3.三线表的插入和空格说明 3.基于复杂情况下表格的插入 1.插入普通的边线表格 &#xff08;1&#xff09;像这个右边的生成的这个比较普通的表格&#xff0c;我们是使用下面的代码实现的&#xff1a; &#xff08;2&#xff09;和插入一个一个图片…...

未来已来:Flutter引领的安卓与跨平台开发奇幻之旅

引言 随着移动开发技术的飞速发展&#xff0c;跨平台开发框架如Flutter正逐渐改变着传统的安卓和iOS开发格局。作为一名资深的安卓开发工程师&#xff0c;我深刻感受到了Flutter带来的变革和机遇。今天&#xff0c;我想与大家分享Flutter在跨平台开发中的奇幻之旅&#xff0c;…...

如何将Windows PC变成Wi-Fi热点?这里提供详细步骤

序言 Windows 10和Windows 11都有内置功能,可以将你的笔记本电脑(或台式机)变成无线热点,允许其他设备连接到它并共享你的互联网连接。以下是操作指南。 由于Windows中隐藏的虚拟Wi-Fi适配器功能,你甚至可以在连接到另一个Wi-Fi网络或无线路由器时创建Wi-Fi热点,通过另…...

报错:Cannot invoke “springfox.documentation.service.ParameterType.getIn()“

文章目录 前言一、报错分析二、解决办法修改代码 总结 前言 遇到报错&#xff1a;Cannot invoke "springfox.documentation.service.ParameterType.getIn()" because the return value of "springfox.documentation.service.RequestParameter.getIn()" is …...

一个生动的例子——通过ERC20接口访问Tether合约

生动的例子 USDT&#xff1a;符合ERC20标准的美元稳定币&#xff0c;Tether合约获得测试网上Tether合约地址通过自己写的ERC20接口访问这个合约 Tether合约地址&#xff1a;0xdAC17F958D2ee523a2206206994597C13D831ec7 IERC20.sol // SPDX-License-Identifier: GPL-3.0pra…...

新媒体时代,LCD电子价签赋予零售场景新活力

近年来&#xff0c;全球企业迅速掀起了数字化转型的浪潮&#xff0c;加速了新零售科技的发展与应用。在实体零售门店中&#xff0c;商品货架显示逐渐趋向智能化和多样化。然而&#xff0c;在信息传播日益碎片化和视频化的时代&#xff0c;零售门店如何更有效地吸引消费者的注意…...

芋道源码 / yudao-cloud:前端技术架构探索与实践

摘要&#xff1a; 随着企业信息化建设的深入&#xff0c;后台管理系统在企业运营中扮演着至关重要的角色。本文将以芋道源码的yudao-cloud项目为例&#xff0c;深入探讨其前端技术架构的设计思路、关键技术与实现细节&#xff0c;并分享在开发过程中遇到的挑战与解决方案。 一、…...

2024 angstromCTF re 部分wp

Guess the Flag 附件拖入ida 比较简单&#xff0c;就一个异或 switcher 附件拖入ida 明文flag Polyomino 附件拖入ida 需要输入九个数&#xff0c;然后进入处理和判断&#xff0c;如果满足条件则进入输出flag部分&#xff0c;flag和输入有关&#xff0c;所以要理解需要满足什么…...

STL库--priority_queue

目录 priority_queue定义 prority_queue容器内元素的访问 priority_queue()常用函数实例解析 priority_queue内元素优先级的设置 priority_queue的常见用途 priority_queue又称为优先队列&#xff0c;其底层是用堆来进行实现的。在优先队列中&#xff0c;队首元素一定是当…...

网络编程 —— Http使用httpClient实现页面爬虫

先去找类型的a标签 取出图片所在网址 取出https://desk.3gbizhi.com/deskMV/438.html 搭建Form界面 Http类 public static HttpClient Client { get; } static Http() {HttpClientHandler handler new HttpClientHandler();//处理消息对象//ServerCertificateCustomValidat…...

【本地运行chatgpt-web】启动前端项目和service服务端项目,也是使用nodejs进行开发的。两个都运行成功才可以使用!

1&#xff0c;启动web界面 https://github.com/Chanzhaoyu/chatgpt-web#node https://nodejs.org/en/download/package-manager # 使用nvm 安装最新的 20 版本。 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source /root/.bashrc n…...

TOGAF企业架构章节(核心)知识点(一)

TOGAF标准9.2一共有 6 部分&#xff1a; 第一部分&#xff08;简介&#xff09;&#xff1a;企业架构的关键概念&#xff0c;特别是 TOGAF 方法进行了概要介绍第二部分&#xff08;架构开发方法&#xff09;&#xff1a; TOGAF 框架的核心部分。描述了 TOGAF 架构开发方法&…...

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…...

C++进程间通信 消息队列

C进程间通信 消息队列 消息队列概述消息队列代码示例1. 创建和发送消息的程序&#xff08;sender.cpp&#xff09;2. 接收消息的程序&#xff08;receiver.cpp&#xff09; 代码解释运行步骤运行结果 消息队列概述 消息队列是一种进程间通信机制&#xff0c;允许一个或多个进程…...

mysql中InnoDB的统计数据

大家好。我们知道&#xff0c;mysql中存在许多的统计数据&#xff0c;比如通过SHOW TABLE STATUS 可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;今…...

P459 包装类Wrapper

包装类的分类 1&#xff09;针对八种基本数据类型相应的引用类型——包装类。 2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…...

Kong网关的负载均衡

安装java环境 查询 java安装包 196 yum list java* 安装java8197 yum install -y java-1.8.0-openjdk.x86_64 检验java8是否安装成功。198 java -version2个tomcat准备 另外一个tomcat区别在于&#xff1a;配置文件。conf/server.xml 启动tomcat [rootlocalhost bin]# ./…...

这是一个逗号

还不太能是句号&#xff0c;随想录这两个月算是给我一个学算法的开头&#xff0c;感慨还是挺多的&#xff0c;但是语文功底很差&#xff0c;就接着写流水账吧。 高考前想报计算机&#xff0c;但是那年是先报志愿后考试&#xff0c;家里人劝我选择更稳一点的985&#xff0c;又说…...

oracle tree

select * from "Test"; INSERT INTO "Test" ("id", "name", "pid") VALUES (01, 中国, 00); INSERT INTO "Test" ("id", "name", "pid") VALUES (01.01, 福建, 01); INSERT INTO…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...