排序算法-希尔排序

news2025/1/17 17:59:21

希尔排序

概念

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

过程

希尔排序就是按照一定的gap值,不断地对数组进行插入排序。不一样的希尔排序算法可能采用不一样的gap值。经典希尔算法的gap值为N/2, N/4, … 直到gap值为1,这里的N为数组的长度。

在这里插入图片描述
举个例子:
[8, 9, 1, 7, 2, 3, 5, 4, 6, 0] ,采取间隔 5 (gap = length/2)。创建一个位于 5 个位置间隔的所有值的虚拟子列表。下面这些值是 {8, 3}, {9, 5}, {1, 4}, {7, 6}, {2, 0},我们这五个子序列分别进行插入排序。结果为 [3, 5, 1, 6, 0, 8, 9, 4, 7, 2]

接下来我们采取间隔 2(gap = 5/2),继续按位于2个间隔的所有值进行插入排序,这个间隔将产生以下两个子虚拟列表:[3, 1, 0, 9, 7][5, 6, 8, 4, 2],都进行插入排序,结果为 [0, 2, 1, 4, 3, 5, 7, 6, 9, 8]

最后我们采取间隔 1 (gap = 2/2),也就是对整个序列进行插入排序(此时的序列已经基本有序了),结果为 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

实现

/**e
 * @description: 希尔排序
 * @param {Array} 
 */

function shellSort(arr) {
	let gap = arr.length
	while(gap > 1) {
		gap = Math.floor(gap/2)
		for (let i = 1; i < arr.length; i++) {
			let temp = arr[i]
			let j = i - gap
			for ( ; j >= 0 && temp < arr[j]; j = j-gap) {
				arr[j+gap] = arr[j]
			}
			arr[j+gap] = temp
		}
	}
}

shellSort([8, 9, 1, 7, 2, 3, 5, 4, 6, 0])

希尔排序与直接插入排序区别

希尔排序是插入排序的优化:

1.当数组长度很大时,使用插入排序有个弊端,就是如果最小值排在很末端的时候,插入排序需要从末端开始,逐个往前比较到第一个位置,很低效。而希尔排序通过分组的方式,直接让前端跟末端的元素进行比较,解决了插入排序的这个弊端。

2.当一开始 增量n 很大的时候,每一个子数组的元素很少,所以对每个子数组用插入排序进行内部排序是很高效的;而后随着增量n不断减小,这个数组是越来越有序的,此时使用插入排序也是很有利的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信最新交易接口系统开发源码有哪些?

通达信最新交易接口其实跟市面上的自动交易接口api是比较安全稳定接口&#xff0c;只需要通过第三方证券公司完成交易&#xff0c;也或者是个人与机构做私募量化投资也是可以的。但是最近小编就有注意到&#xff0c;在此之前的通达信接口已经完成了再次升级&#xff0c;那么&am…

JAVA开发(分布式SpringCloud全家桶一些组件读法)

配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;路由&#xff0c;微代理&#xff0c;事件总线&#xff0c;全局锁&#xff0c;决策竞选&#xff0c;分布式会话构成SpringCloud的集合。 Eureka服务注册与发现&#xff08;Eureka&#xff1a;怎么读&#xff1f;&…

没基础的大学生如何自学c语言 ?

C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点&#xff0c;在程序设计中备受青睐。真的太多人学也有太多要学的东西了&#xff0c;以至于后台总有人问C语言该怎么学&#xff0c;甚至还有具体问编程问题的。 这一点专门针对「大部分时间都在写着重复的代码&a…

uniapp初步搭建:如何引入uview库(跨移动多端ui库)

uView是uni-app生态专用的UI框架&#xff0c;uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c; 可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台(引言自uni-app网) 1. 查看项目根目录有没有p…

公钥密码学中的公钥和私钥

公钥密码学解释&#xff1a;它是什么&#xff1f; 公钥基础设施 (PKI) 用于管理互联网通信中的身份和安全性。 启用 PKI 的核心技术是公钥密码术&#xff0c;这是一种依赖于使用两个相关密钥&#xff08;公钥和私钥&#xff09;的加密机制。 这两个密钥一起用于加密和解密消息。…

CM311-3_YST_晨星MSO9385_2+8_安卓9.0_TTL免费升级固件【含教程】

新魔百盒CM311-3_YST_晨星MSO9385_28_安卓9.0_TTL免费升级固件【含教程】 固件特点&#xff1a; 1、修改dns&#xff0c;三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&…

网站攻击技术,一篇打包带走!

大家好&#xff0c;今天给大家介绍一下&#xff0c;Web安全领域常见的一些安全问题。 1. SQL 注入 SQL注入攻击的核心在于让Web服务器执行攻击者期望的SQL语句&#xff0c;以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等操作&#xff0c;达到其邪恶的…

分布式应用之监控平台zabbix的认识与搭建

内容预知 1.监控系统的相关知识 1.1 监控系统运用的原因 1.2 网站的可用性 1.3 市面上常用的监控系统 2.zabbix的相关知识 2.1 zabbix的概述 2.2 zabbix 是什么&#xff1f; 2.3 zabbix的监控原理 2.4 zabbix监控系统中五个常用程序 3. zabbix 服务端的部署 4. 部署…

C++ 不知图系列之基于链接表的无向图最短路径搜索

1. 前言 图的常用存储方式有 2 种&#xff1a; 邻接炬阵。 链接表。 邻接炬阵的优点和缺点都很明显。优点是简单、易理解&#xff0c;但是对于大部分图结构而言&#xff0c;都是稀疏的&#xff0c;使用矩阵存储&#xff0c;空间浪费就较大。 链接表相比较邻接矩阵存储方案…

团队的Code Review实践

高效地进行 Code Review 一直是我们想要做的事情&#xff0c;如何持续保持高效 Review 也是我们日常开发中所亟需解决的问题。 在疫情爆发之前&#xff0c;团队大多是线下一起办公。大家会聚在一起 Code Review&#xff0c;把讨论出的反馈记录在便利贴并贴在白板上。而当远程、…

Baklib|如何为你的营销计划制作Wiki页面

当你需要快速查找信息时&#xff0c;你会怎么做?很有可能&#xff0c;你会直接去谷歌——在输入你的查询之后&#xff0c;十有八九&#xff0c;搜索引擎会带你去wiki百科。wiki百科是一个巨大的在线百科全书。在这个数据库中&#xff0c;几乎所有的文章都有链接。 现在想象一…

Maven之POM介绍

POM介绍前言POM基础为什么要学习POM什么是POMSuper POMMinimal POM&#xff08;POM的最低配置&#xff09;POM特点Project Inheritance(项目继承性&#xff09;Project Aggregation(项目聚合&#xff09;Project Inheritance VS Project AggregationProject Interpolation and …

《FFmpeg Basics》中文版-00-简介

欢迎 亲爱的读者们&#xff0c; 欢迎来到这本书&#xff0c;它将使您熟悉FFmpeg项目的许多有趣的特性。下面的几个大公司都是FFmpeg使用者: Facebook&#xff0c;最大的社交网络&#xff0c;用FFmpeg技术处理用户的视频。Google Chrome&#xff0c;流行的web浏览器&#xff0…

EDI通信中常用的网络排查方法

在知行之桥EDI系统运维工作中不可避免会碰到各种网络问题&#xff0c;本文将分享一些我们运维同事常用的一些网络问题排查定位方法&#xff0c;帮助大家快速的定位原因&#xff0c;解决通信问题。 1.Ping&#xff1a; 作用&#xff1a;ping用于确定本地主机是否能与另一台主机…

shell脚本下用plot给iostat和CPU的采样画图的写法

目前大多的互联网客户,在导入SSD之前&#xff0c;基本会要求OEM或者SSD厂商提供一些性能数据图&#xff0c;所以 作图也基本成了测试人员的必备技能&#xff0c;单盘的性能可以用Excel表格导入&#xff0c;但是复杂的可能会比较麻烦。就需要我们借助工具来作图了。 本篇文章简单…

第9章 Apache-Dbutils实现CRUD操作

1. Apache-DBUtils简介 *commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库&#xff0c;它是对JDBC的简单封装&#xff0c;学习成本极低&#xff0c;并且使用dbutils能极大简化jdbc编码的工作量&#xff0c;同时也不会影响程序的性能。 *API介绍&#xff1a; org.…

java和vue的大学生奖学金助学金系统奖学金系统助学金系统

简介 大学生奖学金助学金系统。学生申请自己需要的奖助学金&#xff0c;上传证明材料。该学院的辅导员可以下载学生的证明材料以及根据学生的综合成绩来审核是否通过&#xff0c;若不通过请输入不通过原因。管理员可以导入学生excel和辅导员excel以及学生综合成绩excel、分布公…

鲲鹏代码迁移工具介绍

鲲鹏代码迁移工具介绍 代码迁移工具介绍 代码迁移工具是什么&#xff1f; ✨我们为什么会需要用到代码迁移工具&#xff1f; ✨处理器所支持的指令集不同&#xff0c;意味着开发者可能需要对代码进行跨平台的迁移。 这里我们常见到便是x86平台的代码往arm平台进行迁移 通常…

主流组件库学习

主流组件库差异性对比 NutUI - 京东研发的移动端 UI 组件库&#xff0c;支持 Vue3、Taro 多端适配&#xff0c;面向电商业务场景Vant - 有赞研发的移动端 UI 组件库&#xff0c;支持 Vue3、微信小程序、支付宝小程序TDesign Mobile - 腾讯研发的移动端组件库&#xff0c;适合在…

Redis第二章_实战篇_短信登录+缓存策略+秒杀+分布式锁>>

Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>> 文章目录Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>>开篇导读1、短信登录1.1、导入黑马点评项目1.1.1 、导入SQL1.1.2、有关当前模型1.1.3、导入后端项目1.1.4、导入前端工程1.1.5 运行前端项目1.2 、基…