ACM_排序

除了sort,你还会什么

Time Limit: 1000/500ms (Java/Others)

Problem Description:

给出若干人的年龄(1~100之间的整数),把它们按照从小到大的顺序输出。

Input:

输入包含多组测试数据。每组数据的第一行为一整数 n,(0<n<=2 000 000),即居民总数;下一行输入 n 个整数,表示各居民的年龄。(输入文件约有20 MB,而内存限制只有2 MB,除了sort(),你还会什么...)

Output:

对于每一组数据,按照从小到大的顺序输出各居民的年龄。相邻年龄用空格隔开。

Sample Input:

3
56 56 56
5
99 91 89 63 91

Sample Output:

56 56 56 
63 89 91 91 99 
解题思路:题目中给出n的最大值为2*10^6,也就是直接调用sort函数的话,会超时,因为其时间复杂度是O(nlogn),但是给出的年龄范围只有1~100,相对n来说很小,也就是说我们可以利用一个数组来存相同年龄的人数,然后从1~100顺序遍历输出即可,注意要用C语言的输入输出,不然会超时!!!
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,x,a[101];
 6     while(~scanf("%d",&n)){
 7         memset(a,0,sizeof(a));
 8         for(int i=1;i<=n;++i){
 9             scanf("%d",&x);a[x]++;
10         }
11         for(int i=1,m=0;i<=100;++i){
12             for(int j=1;j<=a[i];++j){
13                 ++m;printf("%d%s",i,m<n?" ":"
");
14             }
15         }
16     }
17     return 0;
18 }

 也可以使用优先队列:这里了解一下:priority_queue<Type, Container, Functional>Type为数据类型, Container为保存数据的容器,Functional为元素比较方式。如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator>,也就是优先队列是大顶堆,队头元素最大。

AC代码:注意输入输出要用C语言格式,不然真的会超时QAQ。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,x;
 6     priority_queue<int,vector<int>,greater<int> > q;
 7     while(~scanf("%d",&n)){
 8         while(n--){scanf("%d",&x);q.push(x);}
 9         while(q.size()>1){
10             printf("%d ",q.top());q.pop();
11         }
12         printf("%d
",q.top());q.pop();
13     }
14     return 0;
15 }
原文地址:https://www.cnblogs.com/acgoto/p/9010217.html