Hash法排序

题目描述:给你n个整数,请按照从大到小的顺序输出其中前m大的数。

输入:每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个整数(一个数字可能有多个),且都处于区间【-500000,500000】内

输出:对每组测试数据按从大到小的顺序输出前m大的数。

时间限制:1秒      内存:128M

样例输入:

5 3

3 -35 92 213 -644

样例输出:

213 92 3

分析:

1.待排序数字数量庞大(1000000),即使用时间复杂度为O(nlogn)的快排,时间复杂度也会达到千万数量级,而在时限1秒内是不能接受的。所以不能用快速排序。

2.输入数字为整数,区间在【-500000,500000】,可以用hasn数组将数字作为下标保存每个数据。空间内存也不会超出。从头遍历数组,其时间复杂度仍在百万数量级。

注意: 要注意数据的输出格式,最后一个输出后面不加空格。(养成好习惯)

 1 #include<cstdio>
 2 using namespace std;
 3 
 4 int offset=500000; //偏置
 5 int Hash[1000005]={0};
 6 int main()
 7 {
 8     int n,m;
 9     while(scanf("%d%d",&n,&m)!=EOF){
10         int k;
11         for(int i=0;i<n;i++){
12             scanf("%d",&k);
13             Hash[k+offset]++; //统计k输入了多少次
14         }
15 
16         //输出前m个大的数
17         for(int j=1000000;j>=0;j--){
18             while(Hash[j]&&m){
19                 if(m==1){
20                     //注意输出格式,最后一个输出后面不加空格。(养成好习惯)
21                     printf("%d",j-offset);
22                     Hash[j]--;
23                     m--;
24                 }
25                 else{
26                     printf("%d ",j-offset);
27                     Hash[j]--;
28                     m--;
29                 }
30             }
31         }
32     }
33     return 0;
34 }

猜你喜欢

转载自www.cnblogs.com/mld-code-life/p/12218111.html