#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
void radixSort(int, int *);
int getDigitNumber(int);
int getDigitValue(int, int);
int main() {
int n;
f >> n;
int v[n];
for (int i = 0; i < n; ++i) {
f >> v[i];
}
radixSort(n, v);
for (int i = 0; i < n; ++i) {
g << v[i] << " ";
}
return 0;
}
void radixSort(int n, int *v) {
queue <int> c[10];
for (int i = 0; i < 10; ++i) {
while ( c[i].empty() == 0 ) {
c[i].pop();
}
}
int maxDigitNumbers = 0;
for (int i = 0; i < n; ++i) {
maxDigitNumbers = max(maxDigitNumbers, getDigitNumber(v[i]) );
}
for (int i = 1; i <= maxDigitNumbers; ++i) {
for (int j = 0; j < n; ++j) {
int currentDigit = getDigitValue(v[j], i);
c[currentDigit].push(v[j]);
}
int pos = 0;
for (int j = 0; j < 10; ++j) {
while (c[j].empty() == 0 ) {
v[pos] = c[j].front();
pos ++;
c[j].pop();
}
}
}
}
int getDigitNumber(int x) {
int digitNumber = 0;
while (x) {
x = x / 10;
digitNumber ++;
}
return digitNumber;
}
int getDigitValue(int x, int pos) {
int currentDigit = 0;
for (int i = 1; i <= pos; ++i) {
currentDigit = x % 10;
x = x / 10;
}
return currentDigit;
}