using namespace std;
const int N = 1e6 + 10;//防止数组越界。
int q[N], n;
void quick_sort(int q[], int l, int r) //l与r分别表示左边界与右边界。
{
if (l >= r) return; //判断左边界是否大于等于右边界。
int x = q[l + r >> 1], i = l - 1, j = r + 1; //利用两个指针遍历整个数组。
while (i < j)
{
do i ++; while (q[i] < x);
do j --;while (q[j] > x);
if (i < j) swap(q, q[j]);
}
//如果指针所在元素小于x,左指针向右移动;否则停止,如果指针所在元素大于x,右指针向左移动,否则停止。 //最后如果左指针小于右指针,交换两个指针的位置。
//原理为(1 4 3 2 5) -> (1 4(i) 3 2(j) 5) -> (1 2(i) 3 4(j) 5) -> (1 2 3(i, j) 4 5)。
quick_sort(q, l, j), quick_sort(q, j + 1, r); //对左右两部分进行快速排序(分治,递归的思想)。
}
int main()
{
scanf("%d", &n); //读入数组的元素个数n。
for (int i = 0; i < n; i ++) scanf("%d", &q); //读入n个数。
quick_sort(q, 0, n - 1); //利用快速排序,对数组元素进行排序。
for (int i = 0; i < n; i ++) printf("%d ", q);//输入排好序的数组元素。
return 0;
}