#include <cstdio>
#include <cstdlib>
#include <cstring>
/*
int partition(int *A,int le,int ri) {
swap(A[le],A[le + rand() % (ri - le + 1)]);
int p = A[le];
while(le < ri) {
while(A[ri] >= p && ri > le) --ri;
A[le] = A[ri];
while(A[le] <= p && le < ri) ++le;
A[ri] = A[le];
}
A[le] = p;
return le;
}
*/
/*
inline int max(int a,int b) {
return a > b ? a : b;
}
int findpivot (int *a, int i, int j) {
int m, n, p;
m = rand() % (j - i + 1);
n = rand() % (j - i + 1);
p = rand() % (j - i + 1);
return (a[m] < a[n]) ? ((a[n] < a[p]) ? a[n] : max(a[m], a[p]))
: ((a[m] < a[p]) ? a[m] : max(a[n], a[p]));
}
void partition (int *a, int i, int j, int *pl, int *pr) {
int p, l = i, r = j;
p = a[(i + j)/2];
while (1) {
while (l <= j && a[l] <= p) l++;
while (r >= i && a[r] >= p) r--;
if (l < r) swap(a[l], a[r]);
else break;
}
*pl = l; *pr = r;
}
void quicksort (int *a, int i, int j) {
int l, r;
partition(a, i, j, &l, &r);
if (r > i) quicksort (a, i, r);
if (l < j) quicksort (a, l, j);
}
*/
/*
int partition(int *A,int le,int ri) {
//for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
int p = A[le]; //A[ le + rand() % (ri - le + 1) ];
int i = le,j = ri;
while(true) {
while(A[i] < p && i < ri) ++i;
while(A[j] > p && j > le) --j;
if(i < j) swap(A[i],A[j]), ++i,--j;
else { if(i == j) ++i, --j;
//printf("deb: %d %d %d %d\n",le,j,i,ri);
//for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
return j; }
}
}
*/
void swap(int &a,int &b) {
int aux = a; a = b; b = aux;
}
/*
int split(int *A,int le,int ri) { //eu returnez J deci tre sa am grija la primul element
//daca returnam I trebuia sa am grija la ult element
int p = A[ri]; //in cormen e invers pt ca sunt inversate ordinile while'urilor
while(true) {
while( A[le] < p ) ++le;
while( A[ri] > p ) --ri;
if(le < ri) swap(A[le++],A[ri--]);
else
return le == ri ? --ri : ri;
}
}
void qsortt(int *A,int le,int ri) {
if(le < ri) {
for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
int q = split(A,le,ri); printf("deb: %d %d %d\n",le,q,ri);
for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
qsortt(A,le,q - 1); //nu mere cu un singur q pt ca tre luati aman2 i,j
qsortt(A,q + 1,ri);
}
}*/
void qsort(int *A,int le,int ri) {
//for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
if(le < ri) {
int p = A[le + rand() % (ri - le + 1)], i = le - 1, j = ri + 1;
while(true) {
do ++i; while(A[i] < p); //tre luati si pivotii altfel pot ramane aiurea plasati
do --j; while(A[j] > p);
if(i < j) swap(A[i],A[j]);
else { if(i == j) ++i,--j; break; } //poa sa fie |i - j| = 1 sau 2 (poz pivot)
} //poa sa fie 2 pivoti in ult iteratie, at se
// comporta normal
//printf("piv = %d deb le = %d j = %d i = %d ri = %d\n",p,le,j,i,ri);
//for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
qsort(A,le,j);
qsort(A,i,ri);
}
}
int main() {
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
//int x; scanf("%d",&x);
//while(x--) {
int *A,N;
scanf("%d",&N);
A = (int*)calloc(N,sizeof(int));
for(int i=0;i<N;++i) scanf("%d",&A[i]);
qsort(A,0,N - 1);
//int a; int b;
//partition(A,0, N - 1,&a,&b);
//partition(A,0,N-1);
//quickSort(A,0,N-1);
for(int i=0;i<N;++i) printf("%d ",A[i]);
//printf("\n\n\n");}
return 0;
}