import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int index = 0;
int[] nums = new int[n];
while(in.hasNextInt()){
nums[index] = in.nextInt();
index++;
}
// mergeSort(nums);
quickSort(nums, 0, n - 1);
printRes(nums);
}
// 结果输出
public static void printRes(int[] arr){
for(int x : arr){
System.out.print(x + " ");
}
}
// 快速排序
public static void quickSort(int[] arr, int low, int high){
// 递归终止条件:当子数组长度小于等于1时
if(low < high){
int pi = partition(arr, low, high);
// 递归排序基准元素左边的子数组
quickSort(arr, low, pi - 1);
// 递归排序基准元素右边的子数组
quickSort(arr, pi + 1, high);
}
}
public static int partition(int[] arr, int low, int high){
// 选择一个元素作为基准
int pivot = arr[high];
int i = (low - 1);
// 遍历数组,将小于基准的元素放到左边区域
for(int j = low; j < high; j++){
// 如果当前元素小于或等于基准
if(arr[j] < pivot){
i++;
// 交换arr[i]和arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 将基准元素放到正确的位置(左边都小于它,右边都大于它)
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
// 返回基准元素的索引
return i + 1;
}
// ———————— 快速排序 ————————
// 归并排序
public static void mergeSort(int[] arr){
if(arr.length <= 1){
return;
}
// 将数组分成两半
int mid = arr.length / 2;
int[] left = Arrays.copyOfRange(arr,0,mid);
int[] right = Arrays.copyOfRange(arr,mid,arr.length);
mergeSort(left);
mergeSort(right);
// 合并已排序的两半
merge(arr, left, right);
}
// 合并两个已排序的数组到结果数组中
public static void merge(int[] result, int[] left, int[] right){
int i = 0; // 左数组的索引
int j = 0; // 右数组的索引
int k = 0; // 结果数组的索引
while(i < left.length && j < right.length){
if(left[i] <= right[j]){
result[k++] = left[i++];
}else{
result[k++] = right[j++];
}
}
while(i < left.length){
result[k++] = left[i++];
}
while(j < right.length){
result[k++] = right[j++];
}
}
//———————— 归并排序 ——————————
}