sort
Time Limit : 6000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : Accepted Submission(s) :
Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3
3 -35 92 213 -644
Sample Output
213 92 3
Hint
Hint
请用VC/VC++提交
排序题,由于数据较多,故使用冒泡排序会超时,应用快速排序和HASH算法排序,下面是用HASH算法和快速排序的代码,快速排序涉及c++的函数自学吧!HASH算法很有意思,就讲讲,我们经常用到数组存数,但在这不一样,在这里我们用到了数组的空间位置储存信息,我们把输入的数存入对应的数组位置上,就好像将本来混乱输入的数据归位一样,并通过数组的值变化记录下来,具体看看代码就懂了!
代码如下:
#include<stdio.h>
#include<string.h>
int a[1000000];//由于数的大小在
int main()
{
int n,m,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));//将数组所用数赋为0
for(int i=0;i<n;i++)
{
scanf("%d",&k);
a[k+500000]=1;//记录输入的数
}
for(int j=1000000;m>0;j--)
{
if(a[j]==1)
{
if(m==1)
printf("%d\n",j-500000);
else
printf("%d ",j-500000);
m--;
}
}
}
return 0;
}
‚
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000005;
int ans[maxn];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",ans+i);
sort(ans,ans+n);
printf("%d",ans[n-1]);
for(int i=n-2;i>=n-m;i--) printf(" %d",ans[i]);
printf("\n");
}
return 0;
}