#include <stdio.h>

/* キーは0からMまでの範囲の整数 */
#define  M   10

void counting_sort(int a[], int b[], int n);
void print_data(int data[], int array_length);

/* ソートするデータ */
int A[10000];
#define N sizeof(src_data) / sizeof(src_data[0]) /* 要素素 */

/* 作業用配列 */
int B[2000000];
int n;
/* キーの分布を数え上げるための配列 */
int count[10000];

int main()
{
  int i;
  scanf("%d",&n);
  for(i=0;i<n;i++){
    scanf("%d",&A[i]);
  }
  
    counting_sort(A,B,n);

    for(i=0;i<n-1;i++){
      printf("%d ",B[i]);
    }
    printf("%d\n",B[n-1]);
    
    return 0;
}

/* 大きさnの配列aを分布数え上げソートによって整列する。
 *    結果は配列bに得られる */
void counting_sort(int a[], int b[], int n)
{
    int  i;
    // printf("check\n");
    /* カウンタをすべて0にする */
    for (i = 0; i <= M; i++)
        count[i] = 0;

    /* キーを数え上げる */
    for (i = 0; i < n; i++)
        count[a[i]]++;

    /* 数え上げたキーの累積度数分布を求める */
    for (i = 0; i < M; i++) {
        count[i+1] += count[i];
    }

    /* 度数分布に従ってデータを配列aから配列bにコピーする */
    for (i = n - 1; i >= 0; i--) {
        b[--count[a[i]]] = a[i];
    }
}

void print_data(int data[], int array_length)
{
    int i;
    for (i = 0; i < array_length; i++) {
        printf("%d\n", data[i]);
    }
}


