Pe scurt
Sortarea rearanjează elementele după o relație de ordine, de obicei crescător sau descrescător. Din obținem crescător. Numărul de elemente și valorile, inclusiv repetițiile, se păstrează; se schimbă doar ordinea. Lecțiile „Sortarea prin selecție”, „Sortarea prin metoda bulelor”, „Sortarea prin inserție”, „Sortarea prin numărare”, „Sortarea rapidă” și „Sortarea prin interclasare” arată metode diferite.
| Metoda | Ideea | Comparații, în cel mai rău caz | Stabilă |
|---|---|---|---|
| Metoda bulelor | compari vecinii și îi interschimbi dacă nu sunt în ordine | da | |
| Selecția minimului | aduci, pe rând, minimul din partea nesortată pe prima ei poziție | , în orice caz | nu, în forma cu interschimbare |
| Inserția | inserezi fiecare element la locul lui în partea deja sortată | da | |
| Numărarea | numeri de câte ori apare fiecare valoare, apoi le scrii în ordine | fără comparații; pași, cu valoarea maximă | da, în forma care mută elementele |
| Sortarea rapidă (quicksort) | împarți vectorul în jurul unui pivot și sortezi cele două părți | ; în medie de ordinul | nu |
| Sortarea prin interclasare | sortezi cele două jumătăți, apoi le interclasezi | de ordinul | da |
În Python, sorted([5,2,4]) produce lista nouă [2,4,5]. La studierea unui algoritm de sortare urmărești și pașii intermediari, nu numai rezultatul.
În detaliu
Sortarea rearanjează o colecție după o cheie și o ordine, păstrând inclusiv repetițiile. O sortare corectă respectă ordinea cerută și nu pierde elemente. Metodele diferă prin comparații, mutări, memorie suplimentară și comportamentul pe date deja ordonate. O metodă stabilă păstrează ordinea relativă a elementelor cu aceeași cheie, utilă când acestea au și alte câmpuri.
Metoda bulelor
Metoda bulelor interschimbă vecinii dezordonați; după prima trecere, maximul ajunge la final. O variabilă pentru interschimbări permite oprirea când vectorul este sortat. Trecerile pas cu pas, numărul de interschimbări și sortarea după un criteriu sunt în lecția despre bubble sort.
Sortarea prin selecție
Pentru fiecare poziție i, de la prima la penultima, cauți minimul dintre elementele de la i până la final și îl interschimbi cu elementul de pe poziția i. Numărul de comparații este mereu același, dar interschimbările sunt cel mult n − 1, ceea ce o face utilă când mutarea unui element costă mult. Exemplul de mai jos o aplică pas cu pas.
Sortarea prin inserție
Partea din stânga a vectorului este mereu sortată. Iei următorul element, muți spre dreapta elementele mai mari decât el și îl pui pe locul rămas liber, ca atunci când aranjezi cărțile de joc în mână. Pe un vector aproape sortat face foarte puține mutări.
Sortarea prin numărare
Când valorile sunt numere naturale mici (de exemplu, note sau cifre), folosești un vector de frecvență: f[v] reține de câte ori apare valoarea v. Apoi parcurgi valorile posibile în ordine și scrii fiecare valoare de câte ori a apărut. Metoda nu compară elemente între ele, dar are nevoie de un vector cât valoarea maximă.
Sortarea rapidă și sortarea prin interclasare
Ambele sunt aplicații ale metodei divide et impera, din clasa a XI-a. Sortarea rapidă alege un pivot, așază la stânga lui valorile mai mici și la dreapta pe cele mai mari, apoi sortează cele două părți; detaliile sunt în lecția despre quicksort. Sortarea prin interclasare împarte vectorul în două jumătăți, le sortează și le unește într-un singur vector ordonat. Interclasarea a doi vectori deja sortați apare și singură în programa de Bacalaureat.
Un fragment care nu este algoritm de sortare
O metodă simplă compară și schimbă două elemente aflate în ordine greșită:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int v[] = {5, 2, 4};
if (v[0] > v[1]) swap(v[0], v[1]);
if (v[1] > v[2]) swap(v[1], v[2]);
for (int x : v) cout << x << ' ';
return 0;
}
Programul afișează 2 4 5, dar nu este un algoritm de sortare: pentru ar da , adică un șir nesortat. O sortare corectă garantează ordinea pentru toate intrările permise, nu doar pentru un exemplu.
Exemplul 2 — compararea metodelor pe același tablou. Pentru , sortarea prin selecție face 10 comparații și 3 schimburi, metoda bulelor face 10 comparații și 7 schimburi, iar sortarea prin inserție face 7 deplasări de elemente. Numărul de schimburi ale metodei bulelor și numărul de deplasări ale inserției sunt egale cu numărul de inversiuni ale șirului, adică al perechilor aflate în ordine greșită: , , , , , și , în total 7. Pe un tablou deja sortat inserția face doar comparații și nicio deplasare, pe când selecția face tot comparații.
Alegerea unei metode depinde de datele problemei. Pentru tablouri mici și simple se folosește una dintre metodele cu pași; pentru tablouri mari se preferă metodele rapide (sortarea rapidă și sortarea prin interclasare, cu pași), iar pentru valori întregi dintr-un interval mic, sortarea prin numărare, cu pași.
Exemplul 3 — stabilitatea. Elementele , , se ordonează crescător după valoare. O metodă stabilă dă , adică cele două elemente egale rămân în ordinea inițială. Sortarea prin selecție cu schimb simplu poate da pentru șirul : minimul 3 este schimbat cu primul element, iar ajunge după . În Python, sorted și list.sort sunt stabile.
elevi = [(7, "Ana"), (9, "Bia"), (7, "Cora")]
print(sorted(elevi, key=lambda e: e[0]))
Programul afișează [(7, 'Ana'), (7, 'Cora'), (9, 'Bia')]: Ana rămâne înaintea Corei, deși au aceeași notă.
Exemplul 4 — sortarea prin numărare. Pentru șirul , cu valori întregi între 0 și 3, se numără de câte ori apare fiecare valoare: vectorul de frecvențe este , pentru valorile 0, 1, 2 și 3. Apoi fiecare valoare se scrie de atâtea ori cât arată frecvența ei: 0 o dată, 1 de două ori, 2 niciodată, 3 de două ori. Rezultatul este . Metoda nu compară elementele între ele și face aproximativ pași, dar are sens numai dacă domeniul valorilor este mic.
Exemple rezolvate
Exemplul 1: sortarea prin selecție, pas cu pas
Sortează crescător vectorul 7, 3, 9, 1, 5 prin selecția minimului și afișează vectorul după fiecare pas.
- Pasul 1: minimul dintre toate cele cinci valori este 1, pe poziția a patra; îl interschimbi cu 7: 1, 3, 9, 7, 5.
- Pasul 2: minimul dintre 3, 9, 7, 5 este 3, deja pe locul lui: vectorul nu se schimbă.
- Pasul 3: minimul dintre 9, 7, 5 este 5; îl interschimbi cu 9: 1, 3, 5, 7, 9.
- Pasul 4: minimul dintre 7 și 9 este 7, deja pe locul lui.
#include <iostream>
using namespace std;
int main() {
int v[] = {7, 3, 9, 1, 5}, n = 5;
for (int i = 0; i < n - 1; i++) {
int pmin = i; // pozitia minimului din v[i..n-1]
for (int j = i + 1; j < n; j++)
if (v[j] < v[pmin])
pmin = j;
int aux = v[i]; v[i] = v[pmin]; v[pmin] = aux;
for (int k = 0; k < n; k++)
cout << v[k] << " ";
cout << "\n";
}
return 0;
}
Programul afișează:
1 3 9 7 5
1 3 9 7 5
1 3 5 7 9
1 3 5 7 9
Pentru n = 5 elemente, selecția face 4 + 3 + 2 + 1 = 10 comparații, adică , oricum ar fi așezate valorile la început.
Pentru admitere
La un item de examen, stabilește cheia, sensul ordonării și metoda cerută. Dacă enunțul dă pașii sortării prin selecție, inserție sau interschimbare, urmărește exact acei pași; rezultatul final singur nu răspunde la o întrebare despre o etapă intermediară. De exemplu, pentru , ordonarea crescătoare dă , dar după prima trecere a sortării prin selecție primul element este minimul 1 schimbat cu , deci șirul este , iar după prima trecere a metodei bulelor este . Selecția face comparații indiferent de ordinea inițială, iar inserția pe un tablou deja sortat face comparații. Dacă elementele cu aceeași cheie trebuie să își păstreze ordinea relativă, folosește o metodă stabilă.
Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
int c = 0;
for (int i = 0; i < 5; i++)
for (int j = i + 1; j < 6; j++)
c++;
cout << c;
- a) 5
- b) 6
- c) 15
- d) 30
Răspunsul corect este c). Ciclurile parcurg toate perechile de poziții cu dintr-un tablou cu 6 elemente: pentru sunt 5 valori ale lui , pentru sunt 4, apoi 3, 2 și 1. Suma este . Este exact numărul de comparații al sortării prin selecție pentru . Varianta d) numără toate perechile ordonate, iar varianta a) numără numai primul ciclu exterior.
La metoda bulelor, după prima trecere cel mai mare element ajunge pe ultima poziție: din se obține , iar după treceri ultimele elemente sunt deja la locul lor.
Unde apare la examen
- Bacalaureatul, informatică, matematică-informatică: la „Algoritmi elementari”, programa de examen numește metodele de ordonare (metoda bulelor, a inserției, a selecției și a numărării), interclasarea, metodele de căutare și analiza complexității unui algoritm; sortarea rapidă și sortarea prin interclasare nu sunt numite (programa de examen, anexa 2 la OMECTS 4800/2010). În programa școlară veche de clasa a XI-a, ele apar ca exemple de aplicații ale metodei divide et impera (programa de clasa a XI-a).
Greșeli frecvente
- Greșit: două comparații și schimburi pot sorta orice tablou cu trei elemente.Corect: un algoritm de sortare trebuie să funcționeze pentru toate intrările permise.
- Greșit: sortarea poate șterge elementele repetate.Corect: păstrează toate elementele, inclusiv repetițiile; se schimbă doar ordinea.
- Greșit: toate metodele de sortare fac același număr de comparații.Corect: selecția face mereu , iar inserția poate face doar pe date sortate.
- Greșit: sortarea crescătoare a lui este .Corect: aceasta este descrescătoare.
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ă
Întrebări frecvente
Care este cea mai simplă metodă de sortare?
Ce înseamnă că o metodă de sortare este stabilă?
Care metodă de sortare este cea mai rapidă?
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
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X; plan de încadrare: OMECI 3410/2009, anexa 1, p. PDF 1–14; forum.isj.hd.edu.ro; filiera tehnologică: OMECI 3412/2009, anexa 2, tabel X, legislatie.just.ro
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X; 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
- Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42), p. 1632–1633 și 1653–1654; rocnee.eu
- Programa școlară de informatică, clasa a X-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5, clasa X; rocnee.eu
- Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3–4; p. 3 și 6; edu.ro
- 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)
- aplicabilitatea 2027: OMEC 5211/2026, art. 3 alin. (10)
- OMEC 4370/2026, anexa 8, p. 155–156
Desene: Redactare proprie (desen original), conform Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42); rocnee.eu
