ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-6-3 21:03 | 显示全部楼层
本帖已被收录到知识树中,索引项:排序
本帖最后由 779846526 于 2012-6-5 08:02 编辑

Book1.rar (15.45 KB, 下载次数: 25) 老师好,我有一难题想请您帮我看一下,不知能否帮上忙啊

TA的精华主题

TA的得分主题

发表于 2012-6-5 12:22 | 显示全部楼层
谢谢,不过我现在的水平还看不懂,努力中

TA的精华主题

TA的得分主题

发表于 2012-6-13 11:01 | 显示全部楼层
仰望啊,这个高度也太高了吧

TA的精华主题

TA的得分主题

发表于 2012-12-6 13:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Re: 法师,

小妹尝试了一下法师的二元堆排序代码,果然比自己写的最原始的冒泡排序快很多。但是在排序过程中如果数据太多就会出现memory不够的情况,所以想请教一下,如果只想要取出100万个元素中最大的1万个,具体应该怎么做呢?

先多谢了~

TA的精华主题

TA的得分主题

发表于 2012-12-6 17:10 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-7 00:02 | 显示全部楼层
AmandaZhangJie 发表于 2012-12-6 13:10
Re: 法师,

小妹尝试了一下法师的二元堆排序代码,果然比自己写的最原始的冒泡排序快很多。但是在排序过 ...

应该不是内存不够的问题
你最好把附件发上来看一下。

TA的精华主题

TA的得分主题

发表于 2012-12-10 08:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
灰袍法师 发表于 2012-12-7 00:02
应该不是内存不够的问题
你最好把附件发上来看一下。

回复法师,我又检查了一下,发现问题出在排序前一步的生成array的过程中,而排序本身已经很快了。

想要得到50取出15的全部组合的和,给这些和排序的同时又要保留原来那15个数是什么,我的做法是
1)建立了17个很大的array(1个储存和,1个储存组合的编号,剩下15个储存原来的数),
2)使用15层for循环的方法生成了这些和,
3)给和进行堆排序的同时也更新编号,
4)在输出结果的同时根据编号提取15个相应的数。
按照以上方法,最多只能支持24取15。不知道有没有什么更不耗费内存的方法?觉得这个问题大家会不会也很感兴趣呢~先谢谢啦~

由于公司有要求,抱歉不能上传文件。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-10 18:37 | 显示全部楼层
AmandaZhangJie 发表于 2012-12-10 08:35
回复法师,我又检查了一下,发现问题出在排序前一步的生成array的过程中,而排序本身已经很快了。

想要 ...

50取15超过2万亿种组合。怎么可能够内存,即使是存硬盘也得3万多GB
另一方面,50取15的和值,只有 525 种,
也就是 1-2-3...-15 =120  到 36-37...49-50=645
你知道和值就知道排第几了吧?
你们这些玩彩票的人,思维真是奇妙。。。。。。

TA的精华主题

TA的得分主题

发表于 2012-12-21 09:53 | 显示全部楼层
灰袍法师 发表于 2012-12-10 18:37
50取15超过2万亿种组合。怎么可能够内存,即使是存硬盘也得3万多GB
另一方面,50取15的和值,只有 525 种 ...

多谢指点!其实不是彩票,是股票。。。所以一个问题就是各个数字之间的间隔不相等,和值超过了525种。

我现在想出来的方法是首先输出所有数据到txt(参考了法师比较3个m取n方法的帖子,这一步已经完成了,先感谢一下) ,然后分步读取:比如先给开始的100万个排序,再读取100万个,给这200万个排序后保留最大的100万个,然后再读取下一个100万个。。。

还有一些问题没解决,比如怎么读取txt文件里不是从第一行开始的指定行数的数据(查了一下似乎不可以,所以现在想出来的方法是读取1~n行以后删除1~n行,接下来读取的就是原先的第n+1~2n行了,坛子里有没有大牛知道应该怎么删除txt文件里的第1~n行不?)

由于原来的文件不能上传,做完后会上传一个使用随机数据的版本供大家讨论 :)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-21 17:08 | 显示全部楼层
AmandaZhangJie 发表于 2012-12-21 09:53
多谢指点!其实不是彩票,是股票。。。所以一个问题就是各个数字之间的间隔不相等,和值超过了525种。

...

还有一些问题没解决,比如怎么读取txt文件里不是从第一行开始的指定行数的数据(查了一下似乎不可以,所以现在想出来的方法是读取1~n行以后删除1~n行,接下来读取的就是原先的第n+1~2n行了,坛子里有没有大牛知道应该怎么删除txt文件里的第1~n行不?)
------------------------------------------------------------------------
不用文本文件就可以了
存二进制文件,一样可以自定义数据结果,然后直接逐个记录读写,跟文本逐行读写没啥分别的。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 07:30 , Processed in 0.036809 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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