九度题目1431:Sort
题目描述:
给你n个整数,请按从大到小的顺序输出其中前m大的数。
输入:
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
输出:
对每个测试用例,将获得给定分数的学生人数输出。
样例输入:
5 3
3 -35 92 213 -644
样例输出:
213 92 3
分析:
如果使用排序来解决问题,则在题目限定的时间内无法完成。即使采用高效的快速排序,时间复杂度仍然为O(nlogn),仍为千万级别的数量级,在1s的时间限制内无法完成对问题的求解。所以本例介绍了一种在输入数据有如上的特点时,利用Hash实现一种在时间上更加高效的排序方法。
代码:
#include<stdio.h>
#define MAX 1000001
#define OFFSET 500000
int Hash[MAX];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
//初始化Hash
for(int i=0;i<MAX;i++) {
Hash[i]=0;
}
//在Hash中标记数字
for(int j=0;j<n;j++)
{
int num;
scanf("%d",&num);
Hash[num+OFFSET]=1;
}
//遍历Hash,并按指定格式输出
for(int k=MAX-1;k>=0;k--)
{
if(Hash[k]==1)
{
printf("%d",k-OFFSET);
m--;
if(m!=0)
{
printf(" ");
}
else
{
printf("\n");
break;
}
}
}
}
return 0;
}