有什么快速挑出1024个数据中最大五个数的算法?

[复制链接]
7308|29
 楼主| hackthree 发表于 2011-11-16 08:30 | 显示全部楼层 |阅读模式
现在想挑出1024个数据中的最大的五个数。
自己写了个函数,效果不佳,执行的次数太多以至于遇到1024这大数据直接死掉。。
感觉,这个还是要用排序。
有看过一个论坛有位兄弟的快速排序,但是好像挺占用RAM 的,
手上的F103VB的编译过不去,大于F103VB的,也就是大于20KRAM 的都没问题。
各位有什么好的算法思路,
给咱指导指导。。
香水城 发表于 2011-11-16 09:34 | 显示全部楼层
常见的排序方法有7~8种,找一本数据结构的书看看吧。
grissiom 发表于 2011-11-16 09:41 | 显示全部楼层
其实这个根本不用排序~ 用一个五个数的数组,拿到一个数之后和这个数组里的数比较,如果大的话就把数组里最小的那个替换掉。用不了多少资源的……
程序匠人 发表于 2011-11-16 10:33 | 显示全部楼层
同意三楼
123654789 发表于 2011-11-16 10:45 | 显示全部楼层
同意四楼
香水城 发表于 2011-11-16 10:57 | 显示全部楼层
3楼的方法不错,占用资源最少,但速度不一定是最快。
uc_cm0 发表于 2011-11-16 11:23 | 显示全部楼层
本帖最后由 uc_cm0 于 2011-11-16 13:18 编辑
其实这个根本不用排序~ 用一个五个数的数组,拿到一个数之后和这个数组里的数比较,如果大的话就把数组里最小的那个替换掉。用不了多少资源的…… ...
grissiom 发表于 2011-11-16 09:41

9楼正解。
IJK 发表于 2011-11-16 11:39 | 显示全部楼层
用一个五个数的数组
拿到一个数之后和这个数组里的最大的数 比较,如果大的话就把数组里最小的数 删除掉,新的最大的数加入到数组。
uc_cm0 发表于 2011-11-16 11:23


这个办法觉得更好些,但不完备。除了需要跟这个数组里的最大的数 比较,还需要这个数组里的最小的数 比较
airwill 发表于 2011-11-16 12:20 | 显示全部楼层
应该是先比较最小的数, 以保证进入数组的门槛. 然后再嵌入到数组中比它大的数后面. 后面的数依次移出.
可以在比较的时候,就进行移动的.
nongfuxu 发表于 2011-11-16 13:12 | 显示全部楼层
常见的排序方法有7~8种,找一本数据结构的书看看吧

看过用过,不过又忘记了。
知道有相应算法和出处,用时再记了。
 楼主| hackthree 发表于 2011-11-16 13:59 | 显示全部楼层
谢各位。
现在用的是一次扫描数组,将最大的数据提取出来,并将最大数所在位置设置为0,然后重复操作。
 楼主| hackthree 发表于 2011-11-16 14:02 | 显示全部楼层
3# grissiom

好像和我之前的思路有点相同,但是也有点不同,我再琢磨琢磨。。:lol
 楼主| hackthree 发表于 2011-11-16 14:03 | 显示全部楼层
9楼正解。
uc_cm0 发表于 2011-11-16 11:23


这位兄弟未卜先知哈。。
7楼就能预见到9楼了。。:lol
 楼主| hackthree 发表于 2011-11-16 14:06 | 显示全部楼层
应该是先比较最小的数, 以保证进入数组的门槛. 然后再嵌入到数组中比它大的数后面. 后面的数依次移出.
可以在比较的时候,就进行移动的.
airwill 发表于 2011-11-16 12:20


是的,比较最大的数的话,有的情况会漏掉一些数。
wed1314211 发表于 2011-11-16 15:22 | 显示全部楼层
找本数据结构的书看看吧。
grissiom 发表于 2011-11-16 16:07 | 显示全部楼层
要是保证速度的话,要使那五个数的数组是被排序的,这样最多三次比较就能知道新的大数需要放在哪里。五个数组的排序,随便哪个算法就够用了……

具体的代码就不贴了吧……

排序算法的最快时间复杂度是 O(nlogn)。五个数数组扫描一遍的算法时间复杂度是 O(n)。因为避免了不必要的排序(不用对后面的一千多个数进行排序),所以会快些~
原野之狼 发表于 2011-11-16 16:24 | 显示全部楼层
1 建立一个5个数的数组,记作dst[5]
2 从1024数组中拷贝前5个数据到dst
3 标记出dst数组中最小数据的位置,记作pos
4 从1024数组中第6个数开始遍历,数据记作src[i]
5 如果src[i]小于dst[pos]则丢弃,否则用src[i]覆盖dst[pos]
6 扫描dst,依据step3刷新pos值
7 直到遍历结束
8 对dst数组冒泡排序
9 大功告成
2008雨声 发表于 2011-11-16 18:12 | 显示全部楼层
3楼 同感。
xsgy123 发表于 2011-11-16 19:09 | 显示全部楼层
看下数据结构的书
kai102910202 发表于 2011-11-16 20:03 | 显示全部楼层
3楼和17楼似乎很对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

220

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部