ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 二维数组排序,可与range.sort媲美

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-7 19:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:排序
灰袍法师 发表于 2012-2-6 20:54
排序测试用几万条数据,都是看不出什么差别的,反正都不会超过0.x秒。

100万就比较明显了

本文主要内容是把二维数组排序转换为一维排序,至于采用快速排序,因为它可以对单独其中某区间进行排序。用希尔自然也是不错的选择。虽然快速排序最讨厌的是溢出堆栈空间,但那样的数据现实毕竟是没有的,多key排序的附件已经改为rnd。

TA的精华主题

TA的得分主题

发表于 2012-2-8 02:04 | 显示全部楼层
本帖最后由 灰袍法师 于 2012-2-8 02:04 编辑
Zamyi 发表于 2012-2-7 19:00
本文主要内容是把二维数组排序转换为一维排序,至于采用快速排序,因为它可以对单独其中某区间进行排序。 ...

我翻了几本书,都没有说到底简单地 /2 作为分割值有多危险
倒是《计算机程序设计的艺术》一书,有提到如果采用随机分割值,对于随机生成的数据,
出现退化的概率低于 一千万分之一
(退化定义为程序的时间复杂度是超过 20*N*logN,这其实依然是一个可以接受的结果,不算灾难性后果。
这么说来,你原先的想法是正确的,除非人为地构造一个攻击快速排序的数组,否则不用考虑出现“不可接受的退化”。
我自己写了一个VBA验证了一下
我采用随机排序10万次,每次都是对5000个1000到9999的整数排序
最后计算 单次最大耗用时间 跟 平均每次耗用时间 的比例
结果发现
取 /2 作为分割值,最慢的一次排序是平均值的138%
取 随机数 作为分割值,最慢的一次排序是平均值的129%
分别不大。

TA的精华主题

TA的得分主题

发表于 2012-2-8 13:06 | 显示全部楼层
灰袍法师 发表于 2012-2-8 02:04
我翻了几本书,都没有说到底简单地 /2 作为分割值有多危险
倒是《计算机程序设计的艺术》一书,有提到如 ...

个人觉得
     随机分割,是没有一个固定的输入会是"出现极端退化"的数组(或许说是每一次排序运算,那个最坏数组也不同),但固定获取分割值就存在这样一个输入数组,并且无论你运行多少次,还是那个数组.如果说输入是等概率,那么运行次数越多,那么发生最坏情况也应该是越大了.所以说,随机分割,主要是作用是排除人为输入因素.用随机生成数据恐怕是无法比较这个情况.
       初学者的见解,有误,望指正并请见谅.

TA的精华主题

TA的得分主题

发表于 2012-2-8 18:17 | 显示全部楼层
本帖最后由 灰袍法师 于 2012-2-9 21:21 编辑
excelhomeljch 发表于 2012-2-8 13:06
个人觉得
     随机分割,是没有一个固定的输入会是"出现极端退化"的数组(或许说是每一次排序运算,那个最 ...

我也想过这个问题,不过实验的结果似乎 一直是 /2 分割的退化程度比较大,偶尔才会出现随机分割更退化。
暂时没想到为什么。
当然,快速排序本身最适合的输入就是随机数据,所以也许随机数据真的不适合去考验快速排序。
如果用另一种有规律的数据测试,如 正弦函数,而且周期正好是 n的整除数
就明显是 /2 的退化了,几乎是原有耗时的4倍到10倍不等。
因为正如你说的,简单地 /2 更容易被攻击。
附件是我做实验的文档,完全就是拿Zamyi在顶楼的代码,改了随机分割,再跟原版本对比
待排序的数据越多,退化的百分比越低
所以用比较小的test_size测试会更明显,但是太小的规模耗时太短,很难精确测量,所以。。。。。。最后用的是5000到10000这个范围。
快速排序两个简单版本 - 多次随机测试.rar (45.45 KB, 下载次数: 233)
原附件的计时器计数有错误,已改好重新上传

TA的精华主题

TA的得分主题

发表于 2012-2-8 18:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏一个,留待慢慢消化

TA的精华主题

TA的得分主题

发表于 2012-3-27 21:37 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-8 16:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-8 16:10 | 显示全部楼层
源码已上传。这类型本来感兴趣的不多。一个Key速度已经相当,两个稍慢,三个更复杂。

没有找到源码呀

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-8 16:19 | 显示全部楼层
赵莲 发表于 2012-5-8 16:10
源码已上传。这类型本来感兴趣的不多。一个Key速度已经相当,两个稍慢,三个更复杂。

没有找到源码呀

附件《多Key二维数组排序.rar》工作表“源码"中.

TA的精华主题

TA的得分主题

发表于 2012-5-8 16:33 | 显示全部楼层
Zamyi 发表于 2012-5-8 16:19
附件《多Key二维数组排序.rar》工作表“源码"中.

看到了,谢谢。

问题是我的求助没写清楚,我不想在2维里排序

因为是是字典 D(X)=D(X)+1
我想根据ITMES的多少次数来排序 得到对应的KEYS

只需要针对ITEMS排序就可以获得一个序列了  然后按照序列去把DEKS,ITEMS  写进新数组去

比如有5个D(X)=D(X)+1 的过程
写进数组 数组行里 左边是写入KEYS对应的值,右边是ITEMS的值
5个过程就5行

我现在是每次把KEYS 和ITEMS 写进2维过渡数组 然后使用排序 再把排序了的过渡数组写入大数组。

过渡数组是多余的了,浪费时间呢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 12:13 , Processed in 0.043104 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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