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-3 11:50 | 显示全部楼层
本帖已被收录到知识树中,索引项:排序
能否写个类似RANK函数的自定义函数,要求能在数组中操作?
EXCEL的有些函数太牛逼了,硬要在单元格中操作。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-3 14:43 | 显示全部楼层
人形电脑天使心 发表于 2012-2-3 10:23
二分法

http://baike.baidu.com/view/115472.htm

那只是处理一维数组。现在在思考多关键字的排序。

TA的精华主题

TA的得分主题

发表于 2012-2-3 15:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不公开代码,就说说原理吧      

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-3 16:29 | 显示全部楼层
本帖最后由 Zamyi 于 2012-2-3 16:40 编辑
liucqa 发表于 2012-2-3 15:41
不公开代码,就说说原理吧


源码已上传。这类型本来感兴趣的不多。一个Key速度已经相当,两个稍慢,三个更复杂。

TA的精华主题

TA的得分主题

发表于 2012-2-3 16:36 | 显示全部楼层
Zamyi 发表于 2012-2-3 16:29
源码已上传。这类型本来感兴趣的不多。

谢谢楼主分享。

TA的精华主题

TA的得分主题

发表于 2012-2-3 16:39 | 显示全部楼层
Zamyi 发表于 2012-2-3 16:29
源码已上传。这类型本来感兴趣的不多。

谢谢分享
想请问一下,这个很像快速排序,特意用中间位置值作为基准值,是有什么含义吗?
我想如果不用递归可能还有提速的空间

TA的精华主题

TA的得分主题

发表于 2012-2-3 21:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
嗯,略微介绍一下原理吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-6 09:37 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-6 16:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liucqa 发表于 2012-2-3 21:59
嗯,略微介绍一下原理吧

原理很简单,建立一个记录行的一维数组,整个排序只是对这个记录行数组进行排序,最后根据记录位置重排数组。一个Key相当于一个一维数组的排序,二个Key是根据各个节点进行多次排序,最后一次重组。

TA的精华主题

TA的得分主题

发表于 2012-2-6 20:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 灰袍法师 于 2012-2-7 08:15 编辑

排序测试用几万条数据,都是看不出什么差别的,反正都不会超过0.x秒。

100万就比较明显了

我的电脑5万x10,耗时0.27秒
改为100万x10,耗时8.29秒
改为 100万x1,耗时2.30秒,
改为 100万x1,而且用7位长度的随机整数,耗时3.80秒

嗯,比我的慢了一半以上,这个差距跟我的 七种快速排序对比的VBA排序贴 里面,最慢和最快的快速排序差异基本一致。
http://club.excelhome.net/thread-661033-1-1.html
即使不作复杂的优化,我还是建议不要简单地取 * 0.5 作为中位分割值,用 * rand 就安全一些,至少可以防止人为破坏。
人为构造一个未排序的坏数组干掉快速排序很容易,不过实际用到的数据有多少能够干掉最简单的快速排序,还真是不知道。

Zamyi的dll可以排序多关键字多列数据,比我的实用多了。

我的dll最讨厌的地方是:
VS2010开发,VB的变体类型跟 EXCEL2003的变体类型不兼容,所以我的附件至少要在 excel2007 + .Net 2.0 以上才能运行
否则运行结果VBA无法识别(数据倒是已经导入VBA了,但是显示是无法识别的变体类型,shit。)
另外,导入导出耗时太长,我怀疑直接在VB里面访问工作表,应该比导入VBA里面的数组要快得多,懒得再试了。

两个快速排序的单列排序速度对比.rar (59.59 KB, 下载次数: 390)





您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-20 20:50 , Processed in 0.048319 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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