essendo che il numero massimo è limitato ed essendo che mi sembra un esercizio tipo da info teorica.. puoi fare così, :

Dato X, il tuo array lungo m
1) crei un array Ylungo m
2) per ogni elemento x di X
2a) Y[x] = Y[x] + 1
3) hai ordinato l'array, ovvero, Y è della forma:
codice:
   Y[0] = 0
   Y[1] = 2
   Y[2] = 1
    .
    .
    .
   Y[m] = z
e significa che in X ci sono 0 elementi uguali a 0, 2 elementi uguali a 1, i elemento uguale a 2, ..., z elementi uguali m; se vuoi un output basta che stampi, per ogni Y[i] tante i quanto vale Y[i]

se usi un criterio di costo lineare, costa O(n)
se usi un criterio di costo logaritmico costa O(nlog(m)) (perchè fai Y[x] = Y[x] + 1, e sia Y[x] che x al massimo valgono m)



spero di averti aiutato e di aver centrato il problema!