#include <bits/stdc++.h>
using namespace std;

const int N = 100001;
int a[N], tmp[N];
int n;

// 递归函数
// 书写要领:想清楚这个函数的功能

// msort 的作用是,对区间 [l, r] 内的元素进行排序
// 分解到没有元素或者只有一个元素位置 l > r or l == r
//      eg [3, 2] [3, 3]
void msort(int l, int r) {
    // 出口:什么时候应该返回了
    // 出口:无可分解,只有 0 个元素或者 1 个元素
    if (l >= r) {
        return;
    }
    // 没有到达出口需要做的事情
    // l = 1, r = 5, mid = 3
    // [l, mid] [mid + 1, r] ==> [1, 3] | [4, 5]
    int mid = (l + r) / 2;
    msort(l, mid);       // 当我返回的时候,该区间内已经有序
    msort(mid + 1, r);   // 当我返回的时候,该区间内已经有序
    // 合并成一个大问题的解决方案 [l, mid] [mid+1, r] ==> [l, r]
    int i = l, j = mid + 1, tot = 1;   // 红蓝指针
    while (i <= mid && j <= r) {
        if (a[i] < a[j]) {
            tmp[tot] = a[i];
            tot++, i++;   // 指针一起移动
        } else {
            tmp[tot] = a[j];
            tot++, j++;
        }
    }
    // 特殊情况:左边 i -> mid,但是 j 还没移动到右端点 r
    while (j <= r) {
        tmp[tot] = a[j];
        tot++, j++;
    }
    // 特殊情况:右边 j -> r,但是 i 还没移动到右端点 mid
    while (i <= mid) {
        tmp[tot] = a[i];
        tot++, i++;
    }
    // 临时数组内的有序元素返回到区间 [l, r]
    for (int k1 = 1, k2 = l; k1 < tot; k1++, k2++) {
        a[k2] = tmp[k1];
    }
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    msort(1, n);   // 对区间 [1, n] 进行升序排序

    for (int i = 1; i <= n; i++) {
        cout << a[i] << " ";
    }

    return 0;
}