UVA 11462 Age Sort(計數排序法 優化輸入輸出)

賈樹丙發表於2013-07-20

Age Sort

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 (0<n<=2000000), the total number of people. In the next line, there are integers indicating the ages. Input is terminated with a case where = 0. This case should not be processed.

Output

For each case, print a line with 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之間的整數),把他們按照從小到大的順序輸出。

分析:年齡排序。由於資料太大,記憶體限制太緊(甚至都不能把他們全部讀進記憶體),因此無法使用快速排序方法。但整數範圍很小,可以用計數排序法。

程式碼如下:

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cctype> // 為了使用isdigit巨集
 4 
 5 inline int readint() {
 6   char c = getchar();
 7   while(!isdigit(c)) c = getchar();
 8 
 9   int x = 0;
10   while(isdigit(c)) {
11     x = x * 10 + c - '0';
12     c = getchar();
13   }    
14   return x;
15 }
16 
17 int buf[10]; // 宣告成全域性變數可以減小開銷
18 inline void writeint(int i) {
19   int p = 0;
20   if(i == 0) p++; // 特殊情況:i等於0的時候需要輸出0,而不是什麼也不輸出
21   else while(i) {
22     buf[p++] = i % 10;
23     i /= 10;
24   }
25   for(int j = p-1; j >=0; j--) putchar('0' + buf[j]); // 逆序輸出
26 }
27 
28 int main() {
29   int n, x, c[101];
30   while(n = readint()) {
31     memset(c, 0, sizeof(c));
32     for(int i = 0; i < n; i++) c[readint()]++;
33     int first = 1;
34     for(int i = 1; i <= 100; i++)
35       for(int j = 0; j < c[i]; j++) {
36         if(!first) putchar(' ');
37         first = 0;
38         writeint(i);
39       }
40     putchar('\n');
41   }
42   return 0;
43 }

 

 

 

相關文章