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++];
        }
    }
    //———————— 归并排序 ——————————
}