#include <fstream>
using namespace std;
int v[500010], n, i;
ifstream fin ("algsort.in");
ofstream fout("algsort.out");
int poz(int st, int dr) {
int i = st, j = dr, ii = 0, jj = -1;
while (i!=j) {
if (v[i] > v[j]) {
int aux = v[i];
v[i] = v[j];
v[j] = aux;
aux = ii;
ii = -jj;
jj = -aux;
}
i+=ii;
j+=jj;
}
return i;
}
void sorteaza(int st, int dr) {
if (st < dr) {
int p = poz(st, dr);
/// duce pe v[st] la locul sau in cadrul secventei
/// si inainte sa returneze pozitia unde l-a dus
/// separa celelalte elemente ale secvente astfel:
/// cele mai mici ca elementul asezat in tanga lui si cele mai mari in dreapta
sorteaza(st, p-1);
sorteaza(p+1, dr);
/// observam ca la acest algoritm operatiile se fac inainte de autoapeluri
/// aitoapelurile avand sens tocmai datorita separarii elementelor
}
}
int main() {
fin >> n;
for (i=1;i<=n;i++)
fin>>v[i];
sorteaza(1, n);
for (i=1;i<=n;i++)
fout<<v[i]<<" ";
}