最新要闻
- 3000块多品牌SSD质量大PK:整体比机械硬盘可靠
- 玩家购入二手Switch主机:可是被卖家坑惨了
- 航班晚点1小时 机长提速提前20分钟到达帮助乘客换机?山航回应
- 每人1600元!北京发放首批“京彩·绿色”消费券:买手机PC都能用
- 当前热文:涉及121万辆!我国2022年新能源汽车召回量创历史新高:电池、电机缺陷多
- 环球最资讯丨暴风的恋人百度云_暴风的恋人
- 来真的!贾跃亭:3月30日生产FF91 百万豪车来了
- 【天天新视野】30个汽车品牌降价 成都发放消费券:满40万可减8000元
- 【世界独家】华硕发布TUF Gaming M3 Gen II鼠标:仅重59g、IP56防尘防水
- 全球今亮点!过期1天的食物还能吃吗?
- 日系中的另类!国产马自达CX-50内饰发布:原汁原味引入海外版
- 每日快讯!12万元买宝马“3系”?宝马中国回应降价传闻:指导价没变
- 当前快讯:玩家不满《魔戒:咕噜》新宣传片:他没有主角光环!
- 环球热讯:小米搞出“新花样”:可层叠摄像模组专利获授权
- 焦点快报!没有秘密了!AI或能够读取大脑重现梦境
- 今日快看!新老代表接力提建议将牡丹定为国花:100多个国家都有国花了
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【世界聚看点】【希尔排序ShellSort算法详解】Java/Go/Python/JS/C不同语言实现
(相关资料图)
【希尔排序算法详解】Java/Go/Python/JS/C不同语言实现
说明
希尔排序(Shell Sort)是插入排序的一种改进版,也称递减增量排序算法(Diminishing Increment Sort),其实质是将数列分组,然后再按插入算法分别排序,因DL.Shell于1959年提出而得名。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时效率较高,可以达到线性排序的效率。
- 但插入排序对于一般不规则数列来说是低效的,因为插入排序每次只能挪动一位数据。
实现过程
- 定义一个分组间隔(步长),分组规则可以是1/2数组长度或其他。
- 按步长间隔取出数字组成子序列,针对子序列按照插入算法进行排序。
- 步长按照分组规则缩量递减,继续新一轮子序列的插入排序。
- 待步长为1时,再对全体元素进行一次插入排序,排序完成。
步长间隔怎么取呢?在希尔的原稿中建议的初始步长是N/2,就是将每一次排序分成两半,这样取步长在大多数情况下会比插入排序好,但也不是最好。
示意图
性能分析
平均时间复杂度:O(Nlog^2N)最差时间复杂度:O(N^2)空间复杂度:O(1)稳定性:不稳定复杂性:较复杂代码
Java
// java希尔排序算法class ShellSort { /* 1. 希尔排序标准版,基于插入排序进行分组排序,步长按1/2缩减。 */ static int[] shellSort1(int arr[]) { int len = arr.length; // 设置分组增量值(步长)为1/2的数组长度 int gap = len / 2; // 根据步长得到子序列如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (int i = gap; i < len; i++) { int current = arr[i]; int j = i; // 根据步长得到子序列,对子序列按照插入排序 while (j >= gap && current < arr[j - gap]) { System.out.println("gap=" + gap + " i=" + i + " j=" + j + " arr:" + Arrays.toString(arr)); arr[j] = arr[j - gap]; j -= gap; } // 交换当前项 arr[j] = current; } // 缩短一半步长 gap = gap / 2; } return arr; } /* 2. 希尔排序,基于插入排序进行分组排序,步长按3倍递减。 */ public static int[] shellSort2(int[] arr) { int len = arr.length; int gap = 1; // 初始步长按3倍递增,小于1/3数组长度 while (gap < len / 3) { gap = gap * 3 + 1; } // 如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (int i = gap; i < len; i++) { int current = arr[i]; int j = i - gap; // 根据步长得到子序列,对子序列按照插入排序 for (; j >= 0 && arr[j] > current; j -= gap) { System.out.println("gap=" + gap + " i=" + i + " j=" + j + " arr:" + Arrays.toString(arr)); arr[j + gap] = arr[j]; } arr[j + gap] = current; } // 步长按3倍缩减 gap /= 3; } return arr; }
Python
# python希尔排序算法# 1. 希尔排序标准版,基于插入排序进行分组排序,步长按1/2缩减。def shell_sort1(arr): size = len(arr) # 设置分组增量值(步长)为1/2的数组长度 gap = size // 2 # 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while gap > 0: for i in range(gap, size): current = arr[i] j = i # 对子序列按照插入排序 while j >= gap and current < arr[j - gap]: print("gap=" + str(gap) + " i=" + str(i) + " j-gap=" + str(j - gap) + " j=" + str(j)) arr[j] = arr[j - gap] j -= gap # 交换当前项 arr[j] = current # 调整步长为1/2 gap = gap // 2 return arr# 2. 希尔排序,基于插入排序进行分组排序,步长按3倍递减。def shell_sort2(arr): size = len(arr) gap = 1 # 初始步长按3倍递增,小于1/3数组长度 while gap < (size // 3): gap = gap * 3 + 1 # 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while (gap > 0): for i in range(gap, size): current = arr[i] j = i - gap # 对子序列按照插入排序s while j >= 0 and arr[j] > current: print("gap=" + str(gap) + " i=" + str(i) + " j=" + str(j) + " j+gap=" + str(j + gap)) arr[j + gap] = arr[j] j -= gap # 还原当前位置 arr[j + gap] = current # 步长按3倍缩减 gap = gap // 3 return arr
Go
// go语言希尔排序算法// 1. 希尔排序标准版,基于插入排序进行分组排序,步长按1/2缩减。func shellSort1(arr []int) []int { var arrLen int = len(arr) // 设置分组间隔 var gap int = (arrLen / 2) // 如果间隔大于0,则表示还可以继续分 for gap > 0 { for i := 0; i < arrLen; i++ { var current = arr[i] var j = i // 分组按照插入排序 for j >= gap && current < arr[j-gap] { fmt.Println("gap=", gap, "i=", i, " j-gap=", j-gap, " j=", j) arr[j] = arr[j-gap] j -= gap } // 交换当前项 arr[j] = current // 调整步长为1/2 } gap = (gap / 2) } return arr}// 2. 希尔排序,基于插入排序进行分组排序,步长按3倍递减。func shellSort2(arr []int) []int { var arrLen int = len(arr) // 设置分组间隔 var gap int = 1 // 初始步长按3倍递增,小于1/3数组长度 for gap < (arrLen / 3) { gap = gap*3 + 1 } // 如果间隔大于0,则表示还可以继续分 for gap > 0 { for i := gap; i < arrLen; i++ { var current = arr[i] var j = i - gap // 对子序列按照插入排序 for ; j >= 0 && arr[j] > current; j -= gap { fmt.Println("gap=", gap, "i=", i, " j=", j, " j+gap=", (j + gap)) arr[j+gap] = arr[j] } arr[j+gap] = current } // 步长按3倍缩减 gap = (gap / 3) } return arr}
JS
// js希尔排序算法/* 1. 希尔排序标准版,基于插入排序进行分组排序,步长按1/2缩减。 */function shellSort1(arr) { const len = arr.length // 设置分组增量值(步长)为1/2的数组长度 let gap = Math.floor(len / 2) // 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (let i = 0; i < len; i++) { const current = arr[i] let j = i // 对子序列按照插入排序 while (j >= gap && current < arr[j - gap]) { console.log("gap=" + gap + " i=" + i + " j=" + j + " (j - gap)=" + (j - gap), "arr:", arr) arr[j] = arr[j - gap] j -= gap } // 交换当前项 arr[j] = current } // 调整步长为1/2 gap = Math.floor(gap / 2) } return arr}/* 2. 希尔排序,基于插入排序进行分组排序,步长按3倍递减。 */function shellSort2(arr) { const len = arr.length let gap = 1 // 初始步长按3倍递增,小于1/3数组长度 while (gap < Math.floor(len / 3)) { gap = gap * 3 + 1 } // 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (let i = gap; i < len; i++) { const current = arr[i] let j = i - gap // 对子序列按照插入排序 for (; j >= 0 && arr[j] > current; j -= gap) { console.log("gap=" + gap + " i=" + i + " j=" + j + " (j + gap)=" + (j + gap), "arr:", arr) arr[j + gap] = arr[j] } arr[j + gap] = current } // 步长按3倍缩减 gap = Math.floor(gap / 3) } return arr}
TS
// TS希尔排序算法// 1. 希尔排序,基于插入排序进行了分组排序class ShellSort { shellSort1(arr: number[]): number[] { const len = arr.length // 设置分组增量值(步长)为1/2的数组长度 let gap = Math.floor(len / 2) // 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (let i = 0; i < len; i++) { const current = arr[i] let j = i // 对子序列按照插入排序 while (j >= gap && current < arr[j - gap]) { console.log( "gap=" + gap + " i=" + i + " j=" + j + " (j - gap)=" + (j - gap), "arr:", arr ) arr[j] = arr[j - gap] j -= gap } // 交换当前项 arr[j] = current } // 调整步长为1/2 gap = Math.floor(gap / 2) } return arr } /* 2. 希尔排序,基于插入排序进行分组排序,步长按3倍递减。 */ shellSort2(arr: number[]): number[] { const len = arr.length let gap = 1 // 初始步长按3倍递增,小于1/3数组长度 while (gap < Math.floor(len / 3)) { gap = gap * 3 + 1 } // 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (let i = gap; i < len; i++) { const current = arr[i] let j = i - gap // 对子序列按照插入排序 for (; j >= 0 && arr[j] > current; j -= gap) { console.log( "gap=" + gap + " i=" + i + " j=" + j + " (j + gap)=" + (j + gap), "arr:", arr ) arr[j + gap] = arr[j] } arr[j + gap] = current } // 步长按3倍缩减 gap = Math.floor(gap / 3) } return arr }}
C
// C语言希尔排序算法/* 1. 希尔排序标准版,基于插入排序进行分组排序,步长按1/2缩减。 */float *shell_sort1(float arr[], int len){ // 设置分组增量值(步长)为1/2的数组长度 int gap = len / 2; // 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (int i = 0; i < len; i++) { float current = arr[i]; int j = i; // 对子序列按照插入排序 while (j >= gap && current < arr[j - gap]) { arr[j] = arr[j - gap]; j -= gap; } // 交换当前项 arr[j] = current; } // 调整步长为1/2 gap = gap / 2; } return arr;}/* 2. 希尔排序标准版,基于插入排序进行分组排序,步长按1/2缩减。 */int *shell_sort2(int arr[], int len){ // 设置分组增量值(步长)为1/2的数组长度 int gap = 1; // 初始步长按3倍递增,小于1/3数组长度 while (gap < len / 3) { gap = gap * 3 + 1; } // 根据步长得到子序列,如果间隔大于0,则表示还可以继续分组 while (gap > 0) { for (int i = 0; i < len; i++) { int current = arr[i]; int j = i - gap; // 对子序列按照插入排序 for (; j >= 0 && arr[j] > current; j -= gap) { arr[j + gap] = arr[j]; } arr[j + gap] = current; } // 步长按3倍缩减 gap = (gap / 3); } return arr;}
链接
希尔排序算法源码:https://github.com/microwind/algorithms/tree/master/sorts/shellsort
其他排序算法源码:https://github.com/microwind/algorithms
关键词:
-
【世界聚看点】【希尔排序ShellSort算法详解】Java/Go/Python/JS/C不同语言实现
【希尔排序算法详解】Java Go Python JS C不同语言实现说明希尔排序(ShellSort)是插入排序的一种...
来源: 【世界聚看点】【希尔排序ShellSort算法详解】Java/Go/Python/JS/C不同语言实现
环球微头条丨【分享贴】项目中为啥总是项目经理一人干着急?
使用PostgreSQL而不是MySQL存储中型数据有什么好处?
3000块多品牌SSD质量大PK:整体比机械硬盘可靠
玩家购入二手Switch主机:可是被卖家坑惨了
航班晚点1小时 机长提速提前20分钟到达帮助乘客换机?山航回应
每人1600元!北京发放首批“京彩·绿色”消费券:买手机PC都能用
当前热文:涉及121万辆!我国2022年新能源汽车召回量创历史新高:电池、电机缺陷多
环球最资讯丨暴风的恋人百度云_暴风的恋人
有监督学习——线性回归
禁用XXE处理漫谈
腾讯-广点通转化归因
来真的!贾跃亭:3月30日生产FF91 百万豪车来了
【天天新视野】30个汽车品牌降价 成都发放消费券:满40万可减8000元
【世界独家】华硕发布TUF Gaming M3 Gen II鼠标:仅重59g、IP56防尘防水
全球今亮点!过期1天的食物还能吃吗?
日系中的另类!国产马自达CX-50内饰发布:原汁原味引入海外版
加速资源整合,星纪魅族围绕手机、XR、前瞻技术拓展智能生态
Prompt-Engineering-Guide 学习摘要2
今日关注:电动汽车综合检测
观焦点:这几个群,程序员可千万不要进!
每日快讯!12万元买宝马“3系”?宝马中国回应降价传闻:指导价没变
当前快讯:玩家不满《魔戒:咕噜》新宣传片:他没有主角光环!
环球热讯:小米搞出“新花样”:可层叠摄像模组专利获授权
焦点快报!没有秘密了!AI或能够读取大脑重现梦境
今日快看!新老代表接力提建议将牡丹定为国花:100多个国家都有国花了
【天天报资讯】山西李家大院哪些人可以享受半价票优惠
环球新资讯:【机器学习】1. 广义线性模型
【世界新视野】密码学报如何正确Latex投稿?
环球今亮点!快 40 岁,刚被裁。。
金三银四每天一个.NET基础知识巩固(一)
今日要闻!从“13 天”到“0 天”延时,揭秘火山引擎 DataLeap SLA 保障最佳实践
世界热消息:谷歌报复性砸出5620亿参数大模型:比ChatGPT更恐怖 学术圈已刷屏
【环球播资讯】2月国产游戏出海成绩出炉:《原神》获收入和增长双料冠军
Nginx http 文件服务器 中文名称文件乱码以及不能访问下载问题 (解决全过程)
有关马的歇后语有哪些?有关马的古诗有哪些?
工科理科化现象亟待扭转!曹德旺等科学家企业喊话让学生去工厂一线真问题
【世界时快讯】委员喊话农村淘汰、封杀老头乐 网友吵翻:揭秘观点背后让人唏嘘?
隐婚男女的结局是什么?隐婚男女演员介绍
小学二年级班主任工作计划有哪些?小学二年级家长会发言稿
消防逃生的注意事项有哪些?消防逃生演练总结
旅游可持续发展的实质是什么?旅游可持续发展论文模板
英语六级考试时间安排分配是什么?英语六级考试题型简介
世界热头条丨虼蚤的读音是什么_虼蚤
描写景色的词语集锦有哪些?描写景色的段落摘抄
梁祯元为什么叫南韩贾宝玉?梁祯元为什么是队长?
中国相术十二宫都有哪些?相术十二宫实用顺口溜
田宅宫在脸上的什么位置?田宅宫代表什么?
Linux 上的开源视频字幕应用–Live Captions
全球信息:Win10专业版激活方法
【环球播资讯】kafka常用指令
剑指Notion:微软协作平台Loop即将进入公开预览阶段
当前滚动:又来一个“保时捷” 江汽EV3申报:国内首搭载46系列大圆柱电芯
160g超满足:嘉兴特产蛋黄大肉粽2.9元/只大促
环球播报:从“看不起”到“跟不上”:200多名理想汽车车主分享用车体验
热头条丨《街霸6》新解说员宣传片:日本少女冠军人美声甜!
新消息丨国内“投教第一股”九方财富登陆港股,业绩亮眼,市值逼近80亿
面向状态机编程:复杂业务逻辑应对之道
多光源渲染方案 - Many Lights Sampling
世界微动态丨在java中String类为什么要设计成final?Java面试常见问题
报道:LoadRunner——脚本优化(二)
马斯克要自建“乌托邦小镇”:员工全部搬进去 自己当“镇长”
拒绝投影行业亮度虚标!Vidda官宣三色激光全家桶新品
环球最资讯丨新一轮国内油价将于17日迎来调整:有再度搁浅可能
【环球聚看点】彻底解决“刹车争议”!电商平台上线特斯拉脚部专用记录仪:全程摄像
当前播报:简单到复杂:C#拷贝文件的3种方法
环球热门:对LSTM应用于图像的初步理解
【数论与组合数学 1】数论简介、素数、算数基本定理
JS回调地狱
天天视讯!GTX 1050 Ti就能跑!顽皮狗公布《最后生还者:Part 1》PC版配置要求
世界看点:自称12年驾龄 特斯拉Model X车主在线维权:踩刹车没反应加速撞柱子
天天观察:苹果古典音乐软件已上架:Apple Music会员免费用!中国市场随后推出
当前资讯!明基推出首款48寸OLED电竞显示器:4K 120Hz、90W反向供电
《生化危机4:重制版》PS5版疑似已偷跑 小心剧透啊
世界百事通!illustrator学习心得体会(illustrator序列号)
工厂模式进阶用法,如何动态选择对象?
迷你天猫商城代码审计
焦点简讯:K8S 性能优化 - K8S APIServer 调优
【全球聚看点】Prompt-Engineering-Guide 学习摘要1
前端设计模式——装饰者模式
65寸4K大屏电视不到2000元 LCD白菜价即将结束:3月价格上涨10%
环球微头条丨最强AI再次进化 ChatGPT下周升级GPT-4:支持视频了
【环球聚看点】免费玩!《生化危机4:重制版》体验版上线:不限时、不限次
当前滚动:德国电动空中出租车Lilium jet完成测试:时速250km/h 全机36个电风扇
杀疯了!长安深夜放大招 购车百亿补贴:深蓝SL03直降2.2万
世界快看点丨分享几个常用的运维 shell 脚本
世界观点:佳兆业成今年首家复牌出险房企
全球球精选!一座河南小县城的全球钻石生意爆火:价格不到天然的1/3
我国再次成功发射一箭双星:天绘六号A/B星顺利进入预定轨道
当前快看:资助8年的女生毕业放弃工作 嫁给有钱人成家庭主妇 资助人:失眠好几天
天天通讯!上班族如何备考公务员_如何备考公务员
全球焦点!读Java性能权威指南(第2版)笔记12_堆内存中
怎么处理消息重发的问题?
每日热点:HEU KMS Activator 30.0.0全能系统数字许可激活工具(全新体验纪念版)
环球热议:用盆吃10袋泡面男子火了 回应月薪2万邀约:浇完家里18亩地再说
实时:第127篇:异步函数(async和await)练习题(异步,消息队列)
焦点!【LeetCode回溯算法#05】分割回文串(复习双指针判断回文以及substr函数使用记录)
今日热议:【django-vue】celery延迟任务、定时任务 django中使用celery 秒杀功能 双写一致性 首页轮播图定时更新 课程前端页面
世界热头条丨关于JAVA泛型数组类型擦除引发的问题及解决方案
环球今日讯!Mint安装MySQL