Documente Academic
Documente Profesional
Documente Cultură
Implementare în C++
Mai jos este implementarea algoritmului în C++. Nimic special… L-am parcurs
pe {v}v de la {1}1 la {n}n și am actualizat frecvența (numărul de apariții) ale
elementului curent ({v[i]}v[i]) prin frq[v[i]]++. Apoi, l-am parcurs
pe \mathrm{frq}frq de la {0}0 la \mathrm{MAX} - 1MAX−1 (pentru că ăsta e
intervalul de valori al elementelor lui {v}v). Pentru fiecare element \mathrm{frq}
[i]frq[i], cât timp e nenul, îl decrementez, incrementez noul capăt al lui {v}v ({k}k), și
îl copiez acolo pe {i}i.
for (int i = 1; i <= n; i++)
frq[v[i]]++;
int k = 0;
for (int i = 0; i < MAX; i++)
while (frq[i]--)
v[++k] = i;
Copy
Se observă că sortarea prin numărare nu este un algoritm de sortare prin comparare,
deoarece nu se efectuează nicio comparație între elementele vectorului. Soluția poate fi
adaptată și pentru cazul în care intervalul de valori al lui {v}v conține și numere
negative, așa cum am descris în articolul Vectori caracteristici. Vectori de frecvență.
În plus, dacă nu avem nevoie de forma inițială a vectorului (cea nesortată), putem
calcula frecvențele încă din timpul citirii vectorului. De asemenea, dacă nu trebuie decât
să afișăm vectorul sortat, putem afișa elementele direct în while, fără să mai reconstruim
vectorul. Iată mai jos o sursă completă care citește un șir de numere, și le afișează în
ordine crescătoare, folosind sortarea prin numărare.
#include <bits/stdc++.h>
using namespace std;
int n;
int frq[MAX];
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int x; cin >> x;
frq[x]++;
}