#include<iostream>
using namespace std;
const int N=100010;
int a[N];
void qsort(int a[],int l,int r){
if(l>=r) return;//如果递归的过程中,指向数组两边的指针相遇了,说明排序完成,直接return(区间里的元素个数是一个或者没有)
int i=l-1,j=r+1;//因为do while循环要先进行++和--,所以这样初始化
int x=a[(l+r)/2];//中间的分界线,while循环可以使分界线左边的数都小于分界线右边的数
while(i<j){//循环条件之所以是i<j,是因为循环体中没有对l和r进行操作,如果条件是l<r,则会发生死循环
do i++;while(a[i]<x);//先do一次,再判断do不do
do j--;while(a[j]>x);
if(i<j) swap(a[i],a[j]);//如果do while循环结束后,两个指针仍未相遇,说明分界线左边有大于分界线的数或者右边有小于分界线的数或者二者兼有,将其交换
}
qsort(a,l,j),qsort(a,j+1,r);//继续递归分治分开的两个区间,使其再分成四个区间左边区间的数小于右边区间的数,以此类推
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
qsort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}