您的位置:首页 > 其它

UVA 11462 Age Sort(计数排序法 优化输入输出)

2013-07-20 18:12 316 查看
[b]Age Sort[/b]

You are given the ages (in years) of all people of a country with at least 1 year of age. You know that no individual in that country lives for 100 or more years. Now, you are given a very simple task of sorting all the ages in ascending order.

Input
There are multiple test cases in the input file. Each case starts with an integer n (0<n<=2000000), the total number of people. In the next line, there are n integers indicating the ages. Input is terminated with a case where n = 0. This case should not be processed.

Output

For each case, print a line with n space separated integers. These integers are the ages of that country sorted in ascending order.

Warning: Input Data is pretty big (~ 25 MB) so use faster IO.

Sample Input

5

3 4 2 1 5

5

2 3 2 3 1

0

Output for Sample Input

1 2 3 4 5

1 2 2 3 3

题目大意:给定若干居民的年龄(都是1-100之间的整数),把他们按照从小到大的顺序输出。

分析:年龄排序。由于数据太大,内存限制太紧(甚至都不能把他们全部读进内存),因此无法使用快速排序方法。但整数范围很小,可以用计数排序法。

代码如下:

#include<cstdio>
#include<cstring>
#include<cctype> // 为了使用isdigit宏

inline int readint() {
char c = getchar();
while(!isdigit(c)) c = getchar();

int x = 0;
while(isdigit(c)) {
x = x * 10 + c - '0';
c = getchar();
}
return x;
}

int buf[10]; // 声明成全局变量可以减小开销
inline void writeint(int i) {
int p = 0;
if(i == 0) p++; // 特殊情况:i等于0的时候需要输出0,而不是什么也不输出
else while(i) {
buf[p++] = i % 10;
i /= 10;
}
for(int j = p-1; j >=0; j--) putchar('0' + buf[j]); // 逆序输出
}

int main() {
int n, x, c[101];
while(n = readint()) {
memset(c, 0, sizeof(c));
for(int i = 0; i < n; i++) c[readint()]++;
int first = 1;
for(int i = 1; i <= 100; i++)
for(int j = 0; j < c[i]; j++) {
if(!first) putchar(' ');
first = 0;
writeint(i);
}
putchar('\n');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: