import java.util.*;
public class Main{
void run(){
int n = jin.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n ; i++) arr[i] = jin.nextInt();
sort2(arr, 0, n-1);
for (int i = 0 ; i < n ; i ++) System.out.printf("%d ", arr[i]);
}
/*
1. 因为在sorted 数组中,一个数x的左边一定<=x, 右边一定>=x, 所有我们先找到一个点,去确定它在sorted 后的位置
2. 指针i从左到右扫描,找到第一个 >x 的位置, 指针j从右到左扫描,找到第一个<=x 的位置,
交换他们,这样保证了 左边<=x , 右边> x,直到相遇为止,相遇点的值应为 x
3. 此时确定了x的位置,也将问题划分成了2个不相关的子问题, 递归处理即可
*/
void sort(int[] arr, int l, int r){
if (l >= r) return;
int i = l, j = r;
int target = arr[i];
while (i < j){
while(i < j && arr[j] >= target) j--;
if (i < j) arr[i++] = arr[j];
while(i < j && arr[i] <= target) i++;
if (i < j) arr[j--] = arr[i];
}
arr[i] = target;
sort(arr, l, j);
sort(arr, j+1, r);
}
/*看视频*/
void sort2(int[] arr, int l, int r){
if (l >= r) return;
int i = l-1, j = r+1;
int target = arr[l+r+1>>1]; // l+r >> 1 是可能取到左边界的,所以也要用j划分
while (i < j){
while(arr[++i] < target);
while(arr[--j] > target);
if (i < j) swap(arr, i, j);
}
sort2(arr, l, i-1);
sort2(arr, i, r);
}
void swap(int[] arr, int i, int j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
private Scanner jin = new Scanner(System.in);
public static void main(String[] args){new Main().run();}
}