# include <iostream>
# include <cstring>
# include <algorithm>
using namespace std;
const int N= 1e5 + 10 ;
int q[ N] ;
int w[ N] , s[ N] ;
int n, sz;
void insert_sort ( ) { for ( int i= 0 ; i< n; i++ ) { int t= q[ i] , j= i; while ( j> 0 && q[ j- 1 ] > t) { swap ( q[ j] , q[ j- 1 ] ) ; j-- ; } q[ j] = t; }
}
void binary_search_insert_sort ( ) { for ( int i= 0 ; i< n; i++ ) { int t= q[ i] ; if ( t>= q[ i- 1 ] ) { q[ i] = t; continue ; } int l= 0 , r= i; while ( l< r) { int mid= l+ r>> 1 ; if ( q[ mid] > t) r= mid; else l= mid+ 1 ; } for ( int j= i- 1 ; j>= r; j-- ) { q[ j+ 1 ] = q[ j] ; } q[ r] = t; }
}
void bubble_sort ( ) { for ( int i= 0 ; i< n- 1 ; i++ ) { bool has_swap= false ; for ( int j= n- 1 ; j> i; j-- ) { if ( q[ j] < q[ j- 1 ] ) { swap ( q[ j] , q[ j- 1 ] ) ; has_swap= true ; } } if ( ! has_swap) break ; }
}
void select_sort ( ) { for ( int i= 0 ; i< n- 1 ; i++ ) { int k= i; for ( int j= i+ 1 ; j< n; j++ ) { if ( q[ j] < q[ k] ) { k= j; } } swap ( q[ k] , q[ i] ) ; }
}
void shell_sort ( ) { for ( int d= n/ 3 ; d; d = d == 2 ? 1 : d / 3 ) { for ( int start= 0 ; start< d; start++ ) { for ( int i= start+ d; i< n; i+= d) { int t= q[ i] , j= i; while ( j> start&& t< q[ j- d] ) { swap ( q[ j] , q[ j- d] ) ; j= j- d; } q[ j] = t; } } }
}
void quick_sort ( int l, int r) { if ( l>= r) return ; int i= l- 1 , j= r+ 1 , x= q[ ( l+ 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 ( l, j) ; quick_sort ( j+ 1 , r) ;
}
void down ( int t) { int u= t; if ( u* 2 <= sz&& q[ u* 2 ] > q[ t] ) t= u* 2 ; if ( u* 2 + 1 <= sz&& q[ u* 2 + 1 ] > q[ t] ) t= u* 2 + 1 ; if ( u!= t) { swap ( q[ u] , q[ t] ) ; down ( t) ; }
}
void heap_sort ( ) { sz= n; for ( int i = n / 2 ; i; i -- ) down ( i) ; for ( int i= 0 ; i< n- 1 ; i++ ) { swap ( q[ 1 ] , q[ sz] ) ; sz -- ; down ( 1 ) ; }
}
void merge_sort ( int l, int r) { if ( l>= r) return ; int mid= l+ r>> 1 ; merge_sort ( l, mid) , merge_sort ( mid+ 1 , r) ; int i= l, j= mid+ 1 , k= 0 ; while ( i<= mid&& j<= r) { if ( q[ i] <= q[ j] ) w[ k++ ] = q[ i++ ] ; else w[ k++ ] = q[ j++ ] ; } while ( i<= mid) w[ k++ ] = q[ i++ ] ; while ( j<= r) w[ k++ ] = q[ j++ ] ; for ( i= l, j= 0 ; i<= r; i++ , j++ ) q[ i] = w[ j] ;
}
void bucket_sort ( ) { for ( int i= 0 ; i< n; i++ ) s[ q[ i] ] ++ ; for ( int i= 1 ; i< N; i++ ) s[ i] = s[ i] + s[ i- 1 ] ; for ( int i= n- 1 ; i>= 0 ; i-- ) w[ -- s[ q[ i] ] ] = q[ i] ; for ( int i= 0 ; i< n; i++ ) q[ i] = w[ i] ;
}
int main ( ) { cin >> n; for ( int i= 0 ; i< n; i++ ) { cin >> q[ i] ; } bucket_sort ( ) ; for ( int i= 0 ; i< n; i++ ) { cout << q[ i] << " " ; } return 0 ;
}