#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6+10;
int n;
int q[N];//待排序数组
int temp[N];//归并排序辅助数组
// 算法1:快排模板---分治算法
/*
* 1. 确定分界点:
x = a[l]
x = a[r]
q = a[(l + r) / 2]
2. 调整范围:
左边<=x
右边>x
3.递归处理左边和右边
* */
void quick_sort (int q[], int l, int r)
{
if(l >= r) return;
int x = q[l];
int i = l-1;
int j = r+1;
while(i < j)
{
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if(i < j) swap(q[i],q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j+1, r);
}
//算法2:归并排序---分治算法
/*
* 1. 确定分界点 mid = (l + r) / 2
* 2. 递归处理左右两段
* 3. 归并(双指针算法,指针表示【当前指向序列】剩余部分中最小元素的位置)
* */
void merge_sort(int q[], int l, int r)
{
if(l == r) return;
int mid = (l + r) / 2;//1. 确定分界点
merge_sort(q,l,mid);merge_sort(q,mid+1,r);//2. 递归处理左右两端
int k=0,i = l, j = mid + 1;
while (i<=mid && j <= r)
if(q[i] <= q[j]) temp[k++] = q[i++];
else temp[k++] = q[j++];
while (i<=mid) temp[k++] = q[i++];
while (j<=r) temp[k++] = q[j++];
for(i=l,j=0; i<=r;i++,j++)
q[i] = temp[j];
}
int main()
{
scanf("%d",&n);
for (int i=0; i<n; i++) scanf("%d",&q[i]);
// quick_sort(q,0,n-1);//快速排序
// merge_sort(q,0,n-1);//归并排序
sort(q,q+n);//库函数
for (int i =0; i < n; i++) printf("%d ",q[i]);
return 0;
}