• 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 }

  • 相关阅读:
    每种特定的迭代器如何使用
    常量迭代器
    容器迭代器
    三十分钟掌握STL
    高快省的排序算法
    FloatTest32 Example
    /浮点数的比较
    java第一天
    ACwing 898
    POJ 3268
  • 原文地址:https://www.cnblogs.com/mld-code-life/p/12218111.html
Copyright © 2020-2023  润新知