Pe scurt
Sortarea prin numărare este potrivită pentru valori întregi dintr-un interval mic cunoscut. Ținem un contor pentru fiecare valoare posibilă, apoi reconstruim șirul în ordine crescătoare. Pentru , valoarea 2 apare o dată, iar 4 apare de două ori; rezultatul este .
În detaliu
Sortarea prin numărare se folosește pentru numere întregi dintr-un interval mic și cunoscut . Se pregătește un tablou de contoare inițializate cu 0, în care fr[x - L] păstrează de câte ori apare valoarea . Prima parcurgere a șirului mărește contorul fiecărei valori citite. A doua parcurgere reconstruiește șirul în ordine crescătoare: pentru fiecare valoare, în ordinea , se scrie valoarea de atâtea ori cât spune contorul ei. Un contor 0 omite valoarea, iar un contor 3 produce trei copii consecutive. Metoda nu compară elementele între ele. Timpul este , iar memoria auxiliară este , deci este avantajoasă numai când intervalul este mic în comparație cu și nu este potrivită pentru valori foarte mari sau reale.
Exemplul 1 — valori între 0 și 3 (Python).
v = [2, 1, 2, 3]
frecventa = [0] * 4
for x in v:
frecventa[x] += 1
rezultat = []
for valoare in range(4):
rezultat.extend([valoare] * frecventa[valoare])
print(*rezultat)
Vectorul de frecvențe evoluează prin [0,0,1,0], [0,1,1,0], [0,1,2,0] și [0,1,2,1]. Reconstruirea scrie 1 o dată, 2 de două ori și 3 o dată; ieșirea este 1 2 2 3. Valoarea 0 are frecvența 0 și nu apare.
Exemplul 2 — varianta C++. Aceleași două parcurgeri, scrise în C++ pentru valori între 0 și 3:
#include <iostream>
using namespace std;
int main() {
int v[] = {2, 1, 2, 3}, frecventa[4] = {};
for (int i = 0; i < 4; ++i)
++frecventa[v[i]];
for (int valoare = 0; valoare <= 3; ++valoare)
for (int k = 0; k < frecventa[valoare]; ++k)
cout << valoare << " ";
return 0;
}
Programul afișează 1 2 2 3 , inclusiv spațiul de la sfârșit.
Exemplul 3 — interval cu valori negative. Pentru valori din se folosesc patru contoare, iar valoarea se înregistrează la indicele . Șirul produce contoarele [2,0,1,2]: indicele 0 corespunde lui (apare de două ori), indicele 1 lui (nu apare), indicele 2 lui 0 (o dată) și indicele 3 lui 1 (de două ori). Reconstruirea scrie . Tot astfel, notele 7, 9, 7, 10, 5, 9, 7 dau frecvențele 5:1, 7:3, 9:2 și 10:1, deci șirul sortat este .
Alegerea metodei depinde de raportul dintre și mărimea intervalului. Pentru un milion de note între 1 și 10 sunt suficiente 10 contoare, deci metoda este foarte rapidă și economică. Pentru 10 valori cuprinse între 1 și un milion ar fi nevoie de un milion de contoare, deci metoda nu este potrivită.
Reconstruirea simplă nu păstrează ordinea inițială a elementelor egale dacă ele au și alte câmpuri, pentru că scrie doar valoarea. Sortarea stabilă a unor înregistrări cere contoare cumulate și un vector rezultat în care elementele se plasează de la sfârșit.
Exemplul 4 — sortarea stabilă. Pentru șirul din intervalul , frecvențele sunt [1,1,2], iar contoarele cumulate [1,2,4] arată, pentru fiecare valoare, ultima poziție ocupată de ea în șirul sortat (poziții de la 1). Elementele se parcurg de la sfârșit spre început: 0 merge pe poziția 1, al doilea 2 pe poziția 4, valoarea 1 pe poziția 2, iar primul 2 pe poziția 3, după fiecare plasare scăzând cu 1 contorul valorii. Rezultatul este , iar cele două valori egale cu 2 rămân în ordinea inițială.
Pentru admitere
La reconstrucție, un contor 0 omite valoarea respectivă, iar un contor 3 produce trei copii consecutive. Pentru domeniul , indicele 0 corespunde lui , iar indicele 3 corespunde lui 1. Dacă valorile sunt din , declară contoare, inclusiv cel pentru 0. La date cu câmpuri asociate, verifică dacă enunțul cere păstrarea ordinii elementelor egale. Nu confunda sortarea prin numărare cu numărarea elementelor mai mici: aceasta din urmă calculează, pentru fiecare element, poziția finală.
Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
int v[] = {3, 0, 2, 3, 0, 0}, fr[4] = {0};
for (int i = 0; i < 6; i++)
fr[v[i]]++;
for (int x = 0; x <= 3; x++)
for (int k = 0; k < fr[x]; k++)
cout << x << ' ';
- a)
0 0 0 2 3 3 - b)
0 2 3 - c)
3 3 2 0 0 0 - d)
0 0 0 1 2 3 3
Răspunsul corect este a). Frecvențele sunt: 0 apare de 3 ori, 1 nu apare, 2 apare o dată și 3 apare de două ori. Reconstruirea scrie valorile în ordinea crescătoare: 0 0 0, apoi nimic pentru 1, apoi 2, apoi 3 3. Varianta b) scrie fiecare valoare o singură dată, varianta c) este ordinea descrescătoare, iar varianta d) include valoarea 1, care are frecvența 0.
Al doilea exemplu. Un șir are elemente, cu valori întregi din intervalul . Câte contoare sunt necesare și câte operații face metoda? Sunt contoare. Prima parcurgere face incrementări, iar a doua trece prin cele 1000 de contoare și scrie în total valori. Numărul operațiilor este de ordinul , adică . Metoda este avantajoasă, pentru că intervalul este mult mai mic decât .
Greșeli frecvente
- Greșit: sortarea prin numărare compară elementele între ele.Corect: numără aparițiile fiecărei valori și reconstruiește șirul.
- Greșit: este potrivită pentru orice valori întregi.Corect: este potrivită când intervalul valorilor este mic în comparație cu numărul de elemente.
- Greșit: valorile negative pot fi folosite direct ca indici.Corect: indicele este
x - L, unde este limita inferioară a intervalului.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1632–1633 și 1653–1654; OMEC 4370/2026, anexa 8, p. 155–156; rocnee.eu
- OMEC 4370/2026, anexa 8, Informatică IX intensiv, p. 155–156
- OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1632–1633; rocnee.eu
- OMEC 6930/2025, anexa 66, Informatică IX CS militar, Monitorul Oficial nr. 4 bis/8.01.2026, pp. 2563–2578; cdn.edupedu.ro; centralizator oficial actualizat prin OMEC 3224/2026, legislatie.just.ro
- OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1653–1654; rocnee.eu
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3 și 6; aplicabilitatea 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 5–6; edu.ro
Documente consultate
- UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
- Programa școlară de informatică, clasa a X-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42); rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3–4; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original)
