using namespace std;
const int N = 1e6 + 10; //防止数组越界。
int q[N], tmp[N];
int n;
void merge_sort(int q[], int l, int r)
{
if (l >= r) return; //判断左边界是否大于等于右边界。
int mid = l + r >> 1; // 二分判断范围。
merge_sort(q, l, mid), merge_sort(q, mid + 1, r); //分支,对左右两个部分进行归并排序。
int k = 0, i = l, j = mid + 1; //定义两个指针,遍历整个数组,将数组分成两个部分。
while (i <= mid && j <= r)
if (q[i] <= q[j]) tmp[k ++] = q[i ++];
else tmp[k ++] = q[j ++]; //将两部分元素进行比较,较小者放入临时数组中。
while (i <= mid) tmp[k ++] = q[i ++];
while (j <= r) tmp[k ++] = q[j ++];
for (i = l, j = 0; i <= r; i ++, j ++)
q[i] = tmp[j]; //如果这两部分的元素其中有一部分已经被全部放进临时数组了,将另外一部分剩下的元素全部放进临时数组中,最后将临时数组的值赋给原数组。
}
int main()
{
scanf("%d", &n); //读入元素个数n。
for (int i = 0; i < n; i ++)
scanf("%d", &q); //读入n个元素。
merge_sort(q, 0, n - 1); //使用归并排序对数组进行排序。
for (int i = 0; i < n; i ++)
printf("%d ", q); //输出排序好的每个元素。
return 0;
}