求从n(n>=1000)个数中计算最大的10数的算法,要最快的算法(继续问http://community.csdn.net/Expert/topic/4291/4291588.xml?temp=.90382

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

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

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

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


那位大哥能分析这本题堆排序和快速排序的平均时间复杂度。
顺便说说如何算时间复杂度,我一遇到这个问题头就大,什么母函数法,解递归方程法我都用不上啊。
...全文
623 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmmcd 2005-10-17
  • 打赏
  • 举报
回复
堆排序和快速排序的平均时间复杂度都是O(n log n)
虽然数量级相同,但实际情况中,快速排序时间会少几个零头。

考题答案不要认为它绝对是正确的,可以有不同思路。
liangbch 2005-10-09
  • 打赏
  • 举报
回复
一般情况下,快速排序优于堆排序,但当n小于一定值,快排的速度慢于插入排序,我记得一个书推荐的方法是,在递推调用过程中,如果序列的长度<=13,应该调用插入排序。这样说来,从10000中找出10个数,还是插入排序花划算。
 另外,在具体编码时,插入排序可以使用优化的方法。下面给出一个例子,在这个例子中,多个元素的移动使用memcpy函数,可提高效率。

#include "memory.h"
#define TYPE int

void InsertSort(TYPE arr[],int *pCount,TYPE newItem)
{
int i;
int count=*pCount-1;

if (newItem>=arr[count])
{
(*pCount)++;
arr[*pCount]=newItem;
return;
}

for (i=count;i>=0;i--)
{
     if (newItem<arr[i])
break;
}
memcpy((void *)(arr+i+1),(void *)(arr+i),sizeof(TYPE)*(count-i+1));
arr[i]=newItem;
(*pCount)++;
}
zachary7833 2005-10-09
  • 打赏
  • 举报
回复
to liangbch(宝宝) :
方法不错!我所说的quick sort 和 heap sort不是对所有数进行排序,只是到满足要求就停止了。
quick sort 是不断舍弃掉小于某个数的一大部分,下一次只处理大于某个数的部分。
heap sort 也是找到头10个就结束了。

题目是给一个具体的100000个数,我就不知道如何算各个算法的平均情况次数。
liangbch 2005-10-08
  • 打赏
  • 举报
回复
个人认为,这个题用不着quick sort 和heap sort.

我的方法:(如果这个数不重复)

  1.从n个数中取出10个,以插入排序法,按照从小到大的顺序放入数组arr,当n较大时,这个过程可以忽略不计。
2.从剩余的n-10个数中,依次取出每一个数和arr[0]比较,如大于arr[0],则删除arr[0],采用插入排序将此数插入到数组。
  
复杂度分析:
 这个算法代价分为两部分,1,和arr[0]比较,2,插入到数组arr. 对于前者,最好情况,最坏情况总是一样的,计作o(n). 对于后者,虽然每次插入的代价不是固定的,但和n无关,可以认为常量k,故平均和最快情况的仍是kn. 故总的复杂度是o(n).
这个题目虽然是排序,但不是对所有的n个数进行一次完全的排序,而是只关心前10名。既然如此,为什么要对所有的数进行quick sort 和 heap sort做呢???? 我不明白!!!  
  
DooDu 2005-10-08
  • 打赏
  • 举报
回复
快排:平均n*log2(n),最坏情况n^2
堆排:n*log2(n)

复杂度就是执行一次操作的次数,
比如
堆排,取出最大,然后组成新堆,就是最后一个结点上浮,最深的层数是n,则它要移动log2(n)次,因为是二叉的么

这个应该用堆做
zachary7833 2005-10-04
  • 打赏
  • 举报
回复
还有一题大家排序算法的题目多多支持
http://community.csdn.net/Expert/topic/4307/4307070.xml?temp=.8227655

33,028

社区成员

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

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