#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;
}