c语言问题,求n个数中最大的5个

boy2002333 2002-08-03 08:23:15
有n个数字,要取出其中最大的5个,这样的程序怎么写?
...全文
868 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
N3t9h0st 2002-08-04
  • 打赏
  • 举报
回复
有多少个数?10000000个以下就直接排序吧,人的时间比电脑值钱.
以上的话,也很简单,N个中最大的5个数是N-1个中最大的5个加上第N个中最大的5个,知道怎么作了吧?
hefuhua 2002-08-04
  • 打赏
  • 举报
回复
UP break;
dcyu 2002-08-04
  • 打赏
  • 举报
回复
冒泡法最简单。
陈硕 2002-08-04
  • 打赏
  • 举报
回复
fredwu(天地无情) 的办法,复杂度仍然是N^2

这个问题可以确保在线性时间内完成,见Data Structure & Algorithm Analysis by Mark A. Weiss ,chapter 10

如果只要求“平均线性时间”,可以参考C++中的泛型算法nth_element()。
陈硕 2002-08-04
  • 打赏
  • 举报
回复
面对N个元素,找到其中第k大的元素,当k = N / 2时,运算量最大。因为当k > N/2时,问题可以转换为求第N-k小的元素。

面对10,000,000个元素,找到其中第5,000,000大的元素,用我的方法只要一两秒钟(Celeron 1.2G),而这里列出的其他方法恐怕要算上好几天时间。这是一个常见的基本问题,而解法也确实很容易想到。几乎每本算法书都要介绍以上线性时间的解法。
kwok_1980 2002-08-04
  • 打赏
  • 举报
回复
速度是要讲的!
但是,整天只讲速度,对编程没有什么帮助,
你先把程序写出来先再去讲速度也不晚阿!
其实,很多东西要灵活应用才对!
当然,程序越简便越好!
dreamgrc 2002-08-04
  • 打赏
  • 举报
回复
具体问题具体分析,当n不是太大的时候(即运算起来不影响运算速度的时候)
可以用冒泡法,这是可以写一个短小精悍的程序,当然可以用选择法
如n很大的话,最好用指针来写
xiawei999 2002-08-04
  • 打赏
  • 举报
回复
同意 dhfly(dohf
lisding 2002-08-04
  • 打赏
  • 举报
回复
这是一个数据结构的问题,主要是算法。用排序是一种笨拙的方法,上面几个用大小为伍的数组的方法可取。
winco 2002-08-04
  • 打赏
  • 举报
回复
fredwu(天地无情) 的算法不错,可以考虑。:)
laorer 2002-08-04
  • 打赏
  • 举报
回复
用排序法,只用部分还是可以的,我想
Jawan_lee 2002-08-04
  • 打赏
  • 举报
回复
陈硕 2002-08-04
  • 打赏
  • 举报
回复
楼上的程序,如果把
sort(vec.begin(),vec.end());//排序
替换为
nth_element(vec.begin(), vec.end()-5, vec.end());
就正好是我说的方法,结果不变。
陈硕 2002-08-04
  • 打赏
  • 举报
回复
zyb_17flash() 的方法好像有问题,假设原始数据为
a[7]={1, 2, 3, 4, 5, 6, 7};
第一步时,
b[5]=={1, 2, 3, 4, 5}, n = 5, a[5] == 6
第二步时,
b[5]=={6, 2, 3, 4, 5}, n = 6, a[6] == 7
最后得到
b[5]=={7, 2, 3, 4, 5}
而正确结果好像是
b[5]=={3, 4, 5, 6, 7}

我对这个问题的思路是,用类似快速排序的办法,先选取一个pivot - e,做一次partition,确保不小于e的元素位于e的前边,小于e的元素位于e的后边,如果e正好位于第4个位置(数组下标从0开始),则前5个元素就是所求。如果e的位置大于4,说明最大的5个数在前边,就对前一区间重复以上过程;如果e的位置小于4,说明最大的5个数还有两三个在后边,就对后一区间重复以上过程。直至所选取的pivot的位址为4,问题解决。选取pivot可以用median-of-three的办法。
kwok_1980 2002-08-04
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
int a;
int n;
vector<int> vec;
cout<<"How many number do you need? :";//输入具体多少个数
cin>>n;
do
{
cin>>a;
vec.push_back(a);
--n;
}while(n>0);
sort(vec.begin(),vec.end());//排序
if(vec.size()<5)
cerr<<"sorry!the number is enough 5!"<<endl;
for(int i=vec.size()-1,k=0;k<5;i--,k++)
cout<<vec[i]<<' ';//显示后5个,即最大5个
cout<<endl;

return 0;
}

在VC下可以编译通过,
Reve 2002-08-04
  • 打赏
  • 举报
回复
我想的跟楼上的差不多,估计这个会快一点,虽然空间度为5,就N很大的情况来说这个方法较佳。
boy2002333 2002-08-04
  • 打赏
  • 举报
回复
多谢各位,冒泡法对我来说已经够了
zyb_17flash 2002-08-04
  • 打赏
  • 举报
回复
对于N个数去最大的五个数,最好不要先排序,我的方法是这样子的:先用一个数组,数组大小为5,先将前五个数据依次赋到这个数组中,并对这五个数字排序,在依小到大的顺序存储到这个数组中,用一个循环语句从第六个数字开始,在该循环语句内嵌一个循环语句,实现方法:
while(n<=N)
{
for(i=0;i<5;i++)
if(a[n]>b[i]){b[i]=a[n];break;}
n++;
}
注:a[n]中存储的事你的原始数据
这样子b[5]中所存的数据就是你需要的.
tc113 2002-08-03
  • 打赏
  • 举报
回复
我认为最直接,基本上也是最好把的办法是fredwu(天地无情) 的解法了,
reasonev 2002-08-03
  • 打赏
  • 举报
回复
吊桶排序
加载更多回复(11)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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