• 九度oj 题目1374:所有员工年龄排序


    题目描述:

    公司现在要对所有员工的年龄进行排序,因为公司员工的人数非常多,所以要求排序算法的效率要非常高,你能写出这样的程序吗?

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入的第一行为一个整数n(1<= n<=1000000):代表公司内员工的人数。

    输入的第二行包括n个整数:代表公司内每个员工的年龄。其中,员工年龄age的取值范围为(1<=age<=99)。

    输出:

    对应每个测试案例,

    请输出排序后的n个员工的年龄,每个年龄后面有一个空格。

    样例输入:
    5
    43 24 12 57 45
    
    样例输出:
    12 24 43 45 57

    开始没多想,直接快排
     1 #include <cstdio>
     2 #include <algorithm>
     3  
     4 int cmp(const void *a, const void *b) {
     5     int at = *(int *)a;
     6     int bt = *(int *)b;
     7     return at > bt;
     8 }
     9  
    10 int num[1000002];
    11 int n;
    12  
    13 int main(int argc, char const *argv[])
    14 {
    15     while(scanf("%d",&n) != EOF) {
    16         for(int i = 0; i < n; i++) {
    17             scanf("%d",&num[i]);
    18         }
    19         qsort(num, n, sizeof(int), cmp);
    20         for(int i = 0; i < n; i++) {
    21             printf("%d ",num[i]);
    22         }
    23         puts("");
    24     }
    25     return 0;
    26 }

    超时

    立马改成堆排序

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <queue>
     4 using namespace std;
     5  
     6 int n;
     7  
     8 priority_queue <int, vector<int>,greater<int> >que;
     9 int main(int argc, char const *argv[])
    10 {
    11     while(scanf("%d",&n) != EOF) {
    12         for(int i = 0; i < n; i++) {
    13             int tmp;
    14             scanf("%d",&tmp);
    15             que.push(tmp);
    16         }
    17         while(!que.empty()) {
    18             int t = que.top();que.pop();
    19             printf("%d ",t);
    20         }
    21         puts("");
    22     }
    23     return 0;
    24 }

    居然还超时

    仔细看了看题,改成桶排序

     1 #include <cstdio>
     2 #include <cstring>
     3 int n;
     4 int age[100];
     5  
     6 int main(int argc, char const *argv[])
     7 {
     8     while(scanf("%d",&n) != EOF) {
     9         memset(age, 0, sizeof(age));
    10         while(n--){
    11             int tmp;
    12             scanf("%d",&tmp);
    13             age[tmp]++;
    14         }
    15         for(int i = 1; i <= 99; i++) {
    16             for(int j = 0; j < age[i];j++) {
    17                 printf("%d ",i);
    18             }
    19         }
    20         puts("");
    21     }
    22     return 0;
    23 }

    再优化一下

     1 #include <cstdio>
     2 #include <cstring>
     3 int n;
     4 int age[100] = {0};
     5 
     6 int main(int argc, char const *argv[])
     7 {
     8     while(scanf("%d",&n) != EOF) {
     9         while(n--){
    10             int tmp;
    11             scanf("%d",&tmp);
    12             age[tmp]++;
    13         }
    14         for(int i = 1; i <= 99; i++) {
    15             while(age[i]) {
    16                 printf("%d ",i);
    17                 age[i]--;
    18             }
    19         }
    20         puts("");
    21     }
    22     return 0;
    23 }
  • 相关阅读:
    oracle 的exists 的用法
    linux
    C++纯虚函数
    C++ 的虚析构函数
    C++ new
    C++点和箭头操作符用法区别
    static
    关于C的int
    互斥量mutex的简单使用
    nginx服务器屏蔽上游错误码
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5810902.html
Copyright © 2020-2023  润新知