求从n(n>=1000)个数中计算最大的10数的算法,要最快的算法

lettam 2005-09-24 04:02:34
求从n(n>=1000)个数中计算最大的10数的算法,要最快的算法.
...全文
493 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zachary7833 2005-10-04
  • 打赏
  • 举报
回复
是考研的题目吧!我也正好想问。
我开了个新贴继续问大家,大家去看看。
http://community.csdn.net/Expert/topic/4307/4307089.xml?temp=.617901

清华大学考研的答案是:
是用快速排序法,不断的分后半部分(比某个数大的部分),直到这个部分的数量小等于10。不足10个元素在前一部分找相应个数。
(清华大学的数是1500个数好像)

还有一个什么大学也考过(是100000个数),答案是堆排序。

我觉的用堆排序也不慢,只是建堆可能比快速排序慢了。后面选出10个都很快每个都只要longN就能找出。
快速排序偶然性较大,原理上其实和找第k大元素的方法一样。

建堆耗费的时间多还是找第k大元素耗费时间多还真是不一定,我也不知到那个是正确。

那位大哥能分析这本题堆排序和快速排序的平均时间复杂度。
iamltd 2005-09-30
  • 打赏
  • 举报
回复
对这个问题来说,只需要最大的10个
所以选择排序是最快的


虽然普通选择排序是O(n^2)的。但这个问题里面只需要10*n次比较。比其他算法都快
phoenixinter 2005-09-30
  • 打赏
  • 举报
回复
首先,我们知道利用RandomizedSelection可以在O(n)的时间内选出
第k大的数,所以复杂度是O(n)。

当然可以先建堆,然后不停的EXTRACT-MAX,这样的复杂度是O(n+10logn)
也是很小的。
xdop 2005-09-30
  • 打赏
  • 举报
回复
回复人: iamltd(妖) ( ) 信誉:100 2005-09-29 17:02:00 得分: 0


用选择排序,每次选出一个最大的。
只需要10*N次判断比较。仅仅是O(n)的




m=10

普通选择排序应该是 O(n*m)
zhangts 2005-09-30
  • 打赏
  • 举报
回复
是找10个数,又不是全部,为什么要全部排序?
赞同“一怒吧剑”的做法,排序10个数,接下来就是查找问题了
chenyec 2005-09-29
  • 打赏
  • 举报
回复
排个序就行了
iamltd 2005-09-29
  • 打赏
  • 举报
回复
用选择排序,每次选出一个最大的。
只需要10*N次判断比较。仅仅是O(n)的

Zephyrzzz 2005-09-29
  • 打赏
  • 举报
回复
用堆不好吗,建堆O(n),找数O(mlogn),不过理论上用找第k大数方法复杂度低些.
xdop 2005-09-27
  • 打赏
  • 举报
回复
复杂度应该能到O(m+n)
yelling 2005-09-27
  • 打赏
  • 举报
回复
找到第10大的数,用O(n)的算法怎么做?
gnefuil 2005-09-26
  • 打赏
  • 举报
回复
先找到第10大的数,然后在遍历一遍把大于等于它的找出来
以上两步都是O(n)的
boxer_tony 2005-09-26
  • 打赏
  • 举报
回复
Donald E. Knuth在他的书《计算机程序设计艺术》里面进行了较为详细的阐述,大家可以看看
xiaocai0001 2005-09-24
  • 打赏
  • 举报
回复
不知道楼主用的是什么测试程序

我写的一个
快速排序的要比冒泡的快5位左右

其中n=100000, m=10
yelling 2005-09-24
  • 打赏
  • 举报
回复
基本上复杂度在o(m*n)
要优化,比如记一下十个数中的最大值,最小值等等

再快的话,除非m比较大,用数来换链表,可以到o((logm)*n)
hwman 2005-09-24
  • 打赏
  • 举报
回复
用10个元素的数组,用淘汰的方法,复杂度大约n log 10
xiaocai0001 2005-09-24
  • 打赏
  • 举报
回复
快排不是让它排成完全有序的~
lettam 2005-09-24
  • 打赏
  • 举报
回复
快速排序不能满足需求,还是太慢了, yelling(Ray)说的算法我也用过,速度比快排要快点,但是也不能达到目标,需要更快的算法,麻烦大家多出主意
xiaocai0001 2005-09-24
  • 打赏
  • 举报
回复
按平均复杂度
冒泡的是O(m*n)
快排的是O(n*log(n/m))

当m<log2(n/m)时选择冒泡,否则选择快排

针对本题,log2(1000/10) < 10, 所以选择快速排序, 平均效率会更好些的
xiaocai0001 2005-09-24
  • 打赏
  • 举报
回复
这个可以比较一下

至于用什么样的算法是根据M,N的值的

冒泡的复杂度是O(m*n)

快排的最差复杂度是O(n*(n-m)), 最好可能一次完成~~
javan 2005-09-24
  • 打赏
  • 举报
回复
冒泡排序算法,当找到第10个最大元素时,停止。
加载更多回复(3)

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧