ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 灰袍法师

[原创] 有史以来最快的希尔排序 - 比历史贴快10倍,比Excel排序更快 - 兼论堆排序和快速排序

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-2-17 21:57 | 显示全部楼层
本帖已被收录到知识树中,索引项:排序
太厉害了,学习

TA的精华主题

TA的得分主题

发表于 2011-3-28 21:51 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-3-31 21:52 | 显示全部楼层
请教灰袍法师:
希尔排序中有这么一句代码:
If h_arr(i) < (R - L) / 9 Then max_h = i
为什么是“9”,而不是其它数值,该如何选择?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-31 23:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 ningyuanchao 于 2011-3-31 21:52 发表
请教灰袍法师:
希尔排序中有这么一句代码:
If h_arr(i) < (R - L) / 9 Then max_h = i
为什么是“9”,而不是其它数值,该如何选择?


9是我看的书的作者使用的数字,他没有说明原因,以下是我的理解:

9的作用是,对于最大的h,保证每次插入排序最少每组有9个key

如对100个key排序,那么h序列 temp_h = Array(1, 5, 19, 41, 109 ......

如果选择小于100的第一个数值41,那么第一次插入排序的跳跃步长是 41

这样一来每一组插入排序的key就只有2个,第一组是 1,42 第二组是2,43...... 最后一组是 41,82

而且最后的 83 - 100 这18个key将不会在第一遍插入排序出现

这显然是个低效的做法。

所以硬性规定每一组至少要有9个元素,这样我们得到的最大h是5,每一组插入排序有20个元素

第一组就是 1,6,11,16,21,26,31,......91,96

当然,9只是一个随便挑选的数字,一般来说 5-20都应该没啥问题,对于不同的待排序数据,设定不同的每组最小排序数量会导致速度略有差异

不过不明显,而且不可能有一个最优值,所以你大可以选择其它数字,只要相对于key的数量不是极端小,也不是极端大就可以了。

我个人的分析,考虑到插入排序的最坏情况是 O(n^2),第一遍插入排序的元素绝对不能太多

如果第一组排序就是1万key,那么光是这第一次插入排序就可能导致 1万^2 = 1亿次 代码段循环,绝对不可接受!

所以很显然无论如何不应该大于1万,实际上即使是100,我也觉得不可接受,因为那就是1万次 代码段循环啦

9的话,顶多81,
对1000万key排序,第一遍每组排9个,要排111.111万组

另一方面,选择很小的数字如3,虽然每组插入排序的效率都肯定非常高,但是要进行的分组数就太多,所以得不偿失。。。。。。

平衡点肯定可以根据 内外两层代码的执行效率 计算出来
最内层代码 : 对分组大小的一组进行插入排序耗时
外层代码 :对所有key进行分组,然后让最内层代码插入排序

问题是这个执行效率应该在每台电脑都不一样(CPU设计,不同Excel版本的执行效率,内存速度差异等等)

实际上在我的电脑上面,对随机长整数key排序,最佳数字似乎是7。

[ 本帖最后由 灰袍法师 于 2011-3-31 23:48 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-4-1 01:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
厉害,我是直接没有看懂。
拿来用了。

TA的精华主题

TA的得分主题

发表于 2011-4-1 13:08 | 显示全部楼层
感谢灰袍法师耐心详尽的解答。

TA的精华主题

TA的得分主题

发表于 2011-5-2 12:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
灰袍法师又出精品,学习了!

TA的精华主题

TA的得分主题

发表于 2011-5-26 23:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
为什么用冒泡与插入时是12而不是其它呢?

TA的精华主题

TA的得分主题

发表于 2011-5-27 09:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏了好好学习

TA的精华主题

TA的得分主题

发表于 2011-5-27 17:12 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 21:46 , Processed in 0.036531 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表