#include <cstdio>
#include <cstdlib>
#include <stack>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100000;
int val[MAXN];
int n;
void Radix(int byte, int *A, int *B) {
int temp[256];
memset(temp, 0, sizeof(temp));
byte <<= 3;
for (int i = 0; i < n; ++i)
temp[((A[i]) >> (byte)) & 255]++;
for (int i = 1; i < 256; ++i)
temp[i] += temp[i - 1];
for (int i = n - 1; i >= 0; --i) {
B[temp[(A[i] >> (byte)) & 255] - 1] = A[i];
temp[(A[i] >> (byte)) & 255]--;
}
}
void RadixSort() {
int* memory = new(int[n]);
for (unsigned int i = 0; i < sizeof(int); i += 2) {
Radix(i, val, memory);
Radix(i + 1, memory, val);
}
delete[] memory;
}
int main() {
scanf("%d", &n);
for (int i = 0;i < n;i++) {
scanf("%d", &val[i]);
}
RadixSort();
for (int i = 0;i < n;i++) {
printf("%d ", val[i]);
}
puts("");
return 0;
}
/**************************************************************
Problem: 2178
User: admin
Language: C++
Result: Accepted
Time:38 ms
Memory:1952 kb
****************************************************************/