#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N];
//快速排序
void quickSort(int q[], int l, int r){
if(l >= r){
//如果相等应该指的是数组只有一个元素,
//而大于的话暂时我也想不明白
return;
}
int index = q[(l + r) >> 1]; //这个值取谁都行,但是要注意边界问题
// printf("index = %d\n", index);
int i = l - 1, j = r + 1; //同时走两个循环,先往后放一个位置,后续的操作都先做移动操作
// printf("l = %d\n", l);
// printf("r = %d\n", r);
while(i < j){
//只要i指针在j指针的左边,两个指针就都要继续走
//i指针,先移动,再判断,
//当i指针指向的位置的值大于或等于index的值时,就不循环了
//此时i指针指在这个大于或等于index的值的位置
do{
i++;
}while(q[i] < index);
//j指针同理
do{
j--;
}while(q[j] > index);
//他们俩都停下的时候
//如果i指针在j指针的左边,就交换
//如果i指针不在j指针的左边的话,if进不去,下一次循环也进不去
if(i < j){
// printf("q[%d] = %d\n", i, q[i]);
// printf("q[%d] = %d\n", j, q[j]);
q[i] = q[i] ^ q[j];
q[j] = q[i] ^ q[j];
q[i] = q[i] ^ q[j];
//swap(q[i], q[j]);
}
}
/*
for(int i = l; i <= r; i++){
if(i == r){
printf("%d\n", a[i]);
}else {
printf("%d ", a[i]);
}
}
*/
//当i指针不在j指针的左边的话,就证明这个l-r都排好了,
//然后递归的再分两个区间,直到排序完毕
quickSort(q, l, j);
quickSort(q, j + 1, r);
}
int main(){
int n; //需要排序的个数
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
quickSort(a, 0, n - 1);
for(int i = 0; i < n; i++){
if(i == n - 1){
printf("%d", a[i]);
}else {
printf("%d ", a[i]);
}
}
return 0;
}