#include <iostream>
#include <vector>
#include <string>
using namespace std;
void merge_sort(vector <int> &v, vector <int> &temp, int l, int r) {
if(r - l <= 1) return;
int m = l + (r-l)/2;
merge_sort(v, temp, l, m);
merge_sort(v, temp, m, r);
int i = l, j = m, k;
for(k = l; k < r; k++)
if(j == r || (i < m && v[i]<=v[j])) {
temp[k] = v[i];
i++;
}
else {
temp[k] = v[j];
j++;
}
for(k = l; k < r; k ++)
v[k] = temp[k];
}
void quick_sort(vector <int> &a, int l, int r) {
if(r-l <= 1) return;
int m = l + (r-l)/2;
swap(a[l], a[m]);
int i = l+1, j = r;
while(i < j)
if(a[i] <= a[l])
i++;
else {
j--;
swap(a[i], a[j]);
}
swap(a[l], a[i-1]);
quick_sort(a, l, i-1);
quick_sort(a, i, r);
}
void quick_sort_better(vector <int> &a, int l, int r) {
if(r-l <= 1) return;
int m = l + (r-l)/2;
swap(a[l], a[m]);
//inv: a[l+1..i)<a[l], a[i..j) = a[l], a[j..k)=?, a[k..r)>a[l]
int i = l+1, j = l+1, k = r;
while(j < k) {
if(a[j] < a[l]) {
swap(a[i], a[j]);
i++; j++;
}
else if(a[j] == a[l])
j++;
else {
k--;
swap(a[j], a[k]);
}
}
swap(a[l], a[i-1]);
quick_sort_better(a, l, i-1);
quick_sort_better(a, j, r);
}
#include <fstream>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int main() {
int N, x, i;
f>>N;
vector <int> v, temp(N);
while(N--) {
f>>x;
v.push_back(x);
}
quick_sort_better(v, 0, v.size());
for(i=0; i<v.size(); i++)
g<<v[i]<<' ';
}