ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] VBA编程技巧 之 排序算法初探

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-4-25 18:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:排序
谢谢了,楼主!

TA的精华主题

TA的得分主题

发表于 2013-4-25 20:56 | 显示全部楼层
lee1892 发表于 2013-4-24 15:50
对于快速排序而言,数据量的大小并不会是导致堆栈溢出的主要原因,而是数据是否是精心设计过的。

而所 ...

实际上,一个乱序数组是不太可能造成堆栈溢出的,比如在我的机器上单精度数组最大可申请到10^7 ~ 10^8 之间,如果你愿意的话,可以反复测试下述代码是否会堆栈溢出,呵呵:
说实在的,我很怀疑坛子里有几个人能设计出这样的顺序,嘿嘿~
=========================================
我就是那个很倒霉的人,在我写我的排序贴时候,就碰到快速排序运行了几十秒(正常只要几秒。。。。。。我还以为死循环了。)
但是。。。仅此一次,以后再也没碰到过了。

《计算机程序设计的艺术》一书,提到如果采用随机分割值,对于随机生成的数据,
出现退化的概率低于 一千万分之一,退化定义为程序的时间复杂度是超过 20*N*logN

所以,随机数据+随机分割的快速排序,还真的不是想象中的那么“绝对安全”
在完全不能接受任何一次排序出现 耗时20倍 的要求下,单用随机分割的快速排序就不够好了。

当然,对于一般公司数据排序,学校学生排名之类,随机分割的快速排序完全没有任何问题。

TA的精华主题

TA的得分主题

发表于 2013-4-25 21:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
灰袍法师 发表于 2013-4-25 20:56
实际上,一个乱序数组是不太可能造成堆栈溢出的,比如在我的机器上单精度数组最大可申请到10^7 ~ 10^8 之 ...

temp_h = Array(1, 5, 19, 41, 109, 211, 503, 929, 2161, 3907, 8929, 16001, 36293, 64763, 146309, 260609, 587527, 1045061, 2354701, 4188161, 9427967, 16764901, 37730309, 67084289, 150958081)



aTemp = Array(1, 5, 19, 41, 109, 211, 503, 929, 2161, 3907, 8929, 16001, 36293, 64763, 146309, 260609, 587527, 1045055, 2354689, 4188161, 9427969)


搞不明白,与数列个数有关系吗?

TA的精华主题

TA的得分主题

发表于 2013-4-25 22:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太牛了,下载后慢慢消化。

TA的精华主题

TA的得分主题

发表于 2013-4-25 22:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
mjzxlmg 发表于 2013-4-25 21:25
temp_h = Array(1, 5, 19, 41, 109, 211, 503, 929, 2161, 3907, 8929, 16001, 36293, 64763, 146309, 26 ...

希尔排序的H数组,决定了能够处理多大规模的排序,只看最大数字,然后乘以10就差不多了。
最大数字是900万的话,可以高效处理 9000万规模的排序问题。
因此,我们希望如果有一个高效的H序列,那么这个序列的最大数字最好也比较大,可以应付大规模的排序问题。

上面说的堆栈溢出,是针对快速排序而言,希尔排序不会有这个溢出的问题。

TA的精华主题

TA的得分主题

发表于 2013-4-25 23:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
灰袍法师 发表于 2013-4-25 22:48
希尔排序的H数组,决定了能够处理多大规模的排序,只看最大数字,然后乘以10就差不多了。
最大数字是900 ...

谢谢指导,努力学习。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-26 09:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
灰袍法师 发表于 2013-4-25 20:56
实际上,一个乱序数组是不太可能造成堆栈溢出的,比如在我的机器上单精度数组最大可申请到10^7 ~ 10^8 之 ...
我就是那个很倒霉的人,在我写我的排序贴时候,就碰到快速排序运行了几十秒(正常只要几秒。。。。。。我还以为死循环了。)
但是。。。仅此一次,以后再也没碰到过了。

你完全应该去买彩票了,数10万、百万规模的随机,都能碰到~{:soso_e113:}

TA的精华主题

TA的得分主题

发表于 2013-4-26 20:51 | 显示全部楼层
对于我这样一个VBA新手来说,真是看不懂,但我特想知道能把VBA研究的这么深的会是做什么,是不是每天都要跟VBA打交道,如果只是凭着兴趣去学习,而工作中根本就用不到的话应该学不了这么深吧!

TA的精华主题

TA的得分主题

发表于 2013-4-28 11:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
i学习,学习了

TA的精华主题

TA的得分主题

发表于 2013-4-29 08:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
晕,落后太多,简直看不懂!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-23 23:36 , Processed in 0.044622 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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