#include <stdio.h>
#define MAX 500000

void Merge(int [],int,int,int);
void Merge_Sort(int [],int,int);


int main(void){

  int A[MAX];
  int i,n;

  //要素の個数を指定
  scanf("%d",&n);

  //読み込む
  for(i=0;i<n;i++)
    scanf("%d",&A[i]);


  Merge_Sort(A,0,n-1);

  //ソートされた数列を表示させる
  for(i=0;i<n-1;i++)
    printf("%d ",A[i]);
  printf("%d\n",A[i]);

  return 0;
}


//Merge_Sortから送られてきたデータを結合する。
void Merge(int A[],int left,int mid,int right){

  int n1 = mid - 1;
  int n2 = right - left + 1;
  int count = left;
  int store[MAX];
  int i;

  while((left <= n1) && (mid <= right)){

    if(A[left] <= A[mid])
      store[count++] = A[left++];

    else
      store[count++] = A[mid++];
  }

  while (left <= n1)
    store[count++] = A[left++];
  
  while (mid <= right)
    store[count++] = A[mid++];

  for(i=0;i<= n2;i++){
    A[right] = store[right];
    right--;
  }

}

//ここで分割できるだけ分割する
void Merge_Sort(int A[],int left,int right){

  int mid;

  if(left < right){
    mid = (left + right)/2;
    Merge_Sort(A,left,mid);
    Merge_Sort(A,mid+1,right);
    Merge(A,left,mid+1,right);
  }
}