ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [开_80]速度速度速度!大家都来比一比![已总结]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-2-11 14:08 | 显示全部楼层
这是好论坛,我喜欢

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-2-11 14:20 | 显示全部楼层

qee用:

不错!在山菊花的基础上方法有小的变化代码也有一定改进,速度和我的答案已经几乎没有区别了。

只不过需要注意判断max和min的步骤是不能省略的,通过查看生成数据的代码来判断数值范围违背了题意,如果不是文件上传限制我会直接贴出数据而不是只提供生成数据的代码。因此加上判断max和min的代码速度会打一点折扣,但是总的来说速度还是提高的。

TA的精华主题

TA的得分主题

发表于 2006-2-11 14:36 | 显示全部楼层
以下是引用qee用在2006-2-11 13:53:20的发言:

根据给定生成数据的特点,花兄的代码还可进一步简化.



受益,不知下标可以使用负数,走弯路了。

谢谢qee用。

Range("g1:g500") = arr

Range("g1").Resize(500, 1) = arr

失败,看过qee用的代码后知道, arr必须是二维数组,原来一维数组是一行的,原以为是一列的。

再次谢谢。

[此贴子已经被作者于2006-2-11 14:38:25编辑过]

TA的精华主题

TA的得分主题

发表于 2006-2-11 14:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TO:UNARTHUR兄
大略看了题后,根据对UNARTHUR兄排序算法研究的了解,就猜测是想考考大家对这种本数下标排序的了解,看花兄的贴子后,发现一举中的,其实已无悬念,无非是边枝末节再精致一点而已.
但对兄"
判断max和min的步骤是不能省略的",保留看法,由于这种排序法只适用整数,必有一定范围,只需更改定义如arr1(-32768 To 32768),后面For i = 32768 To -32768,实际测试速度几无影响.
做了个附件:

rDj7dyWu.rar (12.27 KB, 下载次数: 44)
[此贴子已经被作者于2006-2-11 16:33:38编辑过]

TA的精华主题

TA的得分主题

发表于 2006-2-11 15:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢UNARTHUR兄和qee用兄的引导,通过几进几出的练习,增进了不少数组方面的知识。qee用兄的帖子有理论有技巧,读起来回味无穷,除了谢谢还是想说谢谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-2-11 23:33 | 显示全部楼层

呵呵!qee用兄的代码加上判断max和min的步骤后和我的代码就是基本一致的了,看得出老兄对代码的控制也是有相当功底的哦。

数组可以用负数作下标我也是最近才发现的,这也就是我在题目中让数值出现负数的原因,本意是想考考大家的:)这种方法还可以用来数据排序,适用于所有最值不是很大的整型数据,而且速度很快,称为计数排序法。

对于本题来说直接dim(-500 to +500)的做法是不允许的,至少是不推荐。例如如果我直接贴出数值,然后说明数据范围在-1000000到+1000000之间或更大呢(实际范围却比这个小很多)?那么直接声明这么大的一个数组是会很慢的,赋值过程也会慢不少,甚至物理内存都有可能分配不出这么大的空间来。因此我认为在代码中判断max和min的步骤是必需的。

另外有一点不知道qee用兄和山菊花兄有没有注意到,其实山菊花兄的代码比我的代码慢一些的原因并不主要在于没有声明负数的下标,而是在于这一句:counts(arr(i,j))=counts(arr(i,j))+1 (couns为计数数组)。 既然已经用n记录了arr(i,j)用于判断与后一个不重复,那么这一句就应该改为counts(n)=counts(n)+1速度能够提高。因为在一个大数组中寻找对应下标返回值会比直接使用变量慢,声明一个数组物理内存会马上划分出相应的空间用于存放数组信息,当要返回数组中的某个元素时系统都会进行一次寻址操作,数组越大寻址时间就会越长。所以当你在代码中要多次引用同一个数组元素时,不如先用一个普通变量将这个数组的值提取出来n=arr(i,j),以避免重复寻址。这一点在qee用兄的代码中已经改进过来了,很是难得。

这个我看着差不多都可以当我的总结贴了,因为再多的我也讲不出来了,呵呵!不对的地方还请大家指教。

TA的精华主题

TA的得分主题

发表于 2006-2-13 08:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

既然已经用n记录了arr(i,j)用于判断与后一个不重复,那么这一句就应该改为counts(n)=counts(n)+1速度能够提高。

原先我感觉我的代码较慢,我猜想是这个原因,现在得到了证实,谢谢!

上面的代码我都看过了,很是受益,我就不献丑了!

TA的精华主题

TA的得分主题

发表于 2006-2-13 10:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-2-13 22:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-2-14 10:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

受益匪浅...

纯数组的操作果然快

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

本版积分规则

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

GMT+8, 2024-12-23 14:22 , Processed in 0.033541 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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