Didaxis
lecție · Informatică

Sortarea cu heap

Construirea heapului și extrageri succesive.

Se face în:
Clasa a XI-a
Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 2 · rezumatul lecției

Pe scurt

Heapsort sortează crescător construind un max-heap, apoi mutând repetat maximul de la rădăcină la sfârșitul zonei încă nesortate. Pentru , 3 este deja la rădăcină; îl schimbăm cu ultimul element, apoi refacem heap-ul pe primele două poziții. Rezultatul final este .

Desen la lecția „Sortarea cu heap”
2în detaliustratul 2 din 2 · pentru clasă și Bacalaureat

În detaliu

Heapsort sortează crescător în trei etape: construiește un max-heap din tablou, apoi repetă pași în care mută maximul (rădăcina) pe ultima poziție a zonei încă nesortate, micșorează zona heap-ului cu 1 și restabilește proprietatea heap prin coborârea noii rădăcini. Sufixul din dreapta, deja sortat, crește după fiecare extragere, iar zona heap-ului scade. Construirea pornește de la ultimul părinte, de pe poziția (indici de la 1), și coboară spre rădăcină, aplicând coborârea fiecărui nod; costă . Fiecare extragere costă , deci întregul algoritm costă în cel mai rău caz. Sortarea se face în același tablou, cu memorie auxiliară constantă, dar nu este stabilă.

Exemplul 1 — urmărirea algoritmului. Se sortează tabloul , care nu este heap. Programul afișează tabloul după construire și după fiecare extragere:

#include <algorithm>
#include <iostream>
using namespace std;
void coboara(int h[], int i, int n) {
    while (2 * i <= n) {
        int f = 2 * i;
        if (f + 1 <= n && h[f + 1] > h[f]) ++f;
        if (h[i] >= h[f]) break;
        swap(h[i], h[f]);
        i = f;
    }
}
void afis(int h[], int n) {
    for (int k = 1; k <= n; ++k) cout << h[k] << " ";
    cout << "\n";
}
int main() {
    int h[] = {0, 1, 3, 2, 5}, n = 4;
    for (int i = n / 2; i >= 1; --i) coboara(h, i, n);
    afis(h, n);
    for (int m = n; m > 1; --m) {
        swap(h[1], h[m]);
        coboara(h, 1, m - 1);
        afis(h, n);
    }
}

Se afișează 5 3 2 1, 3 1 2 5, 2 1 3 5 și 1 2 3 5. La construire, părintele de pe poziția 2 (valoarea 3) are fiul 5 și se schimbă cu el: ; rădăcina 1 se schimbă cu 5: , apoi cu 3: . Prima extragere schimbă 5 cu ultimul element și coboară noua rădăcină în zona de 3 elemente: . A doua schimbă 3 cu 2: , iar a treia schimbă 2 cu 1: . Semnul | desparte zona heap-ului de sufixul sortat.

Exemplul 2 — instabilitatea. Se sortează cheile , , , unde indicii a și b arată ordinea inițială a cheilor egale. Tabloul este deja max-heap. Prima extragere schimbă rădăcina cu ultimul element: , iar zona heap-ului este . Coborârea schimbă 1 cu : . A doua extragere dă . Rezultatul are cheile egale în ordinea inversă față de cea inițială ( înaintea lui ), deci heapsort nu este stabil. Acesta este motivul pentru care, când ordinea elementelor egale contează, se alege o sortare stabilă, de exemplu prin interclasare.

Exemplul 3 — în formatul examenului. Se construiește un max-heap din tabloul , prin coborâre începând de la ultimul părinte. Care este tabloul rezultat?

  • a)
  • b)
  • c)
  • d)

Răspunsul corect este a). Ultimul părinte este pe poziția (valoarea 7), cu fiii 9 și 5; se schimbă 7 cu 9: . Rădăcina 2 are fiii 9 și 4; se schimbă cu 9: . Valoarea 2, acum pe poziția 2, are fiii 7 și 5 și se schimbă cu 7: . Varianta b) oprește coborârea după primul schimb al rădăcinii, c) procesează doar ultimul părinte, iar d) este tabloul sortat descrescător, care este heap, dar nu rezultatul construirii.

Cazul unui tablou deja sortat. Tabloul crescător nu este max-heap, pentru că rădăcina este cel mai mic element. Construirea schimbă 1 cu fiul mai mare, 3, și dă . Prima extragere dă , iar coborârea lui 1 produce ; a doua extragere dă . Heapsort nu are un caz favorabil: și pe date deja sortate face aceleași operații.

Greșeli frecvente

  • Greșit: după mutarea maximului continuăm să refacem heap-ul pe întregul tablou.
    Corect: excludem sufixul deja sortat.
  • Greșit: heapsort folosește un min-heap pentru sortare crescătoare în varianta descrisă.
    Corect: folosește max-heap.
  • Greșit: heapsort este garantat stabil.
    Corect: schimburile pot inversa ordinea elementelor egale.
în contul tăuPremium

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:

  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI intensiv; rocnee.eu

Documente consultate

  • Programa școlară de informatică intensiv, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
  • OpenDSA, „Heapsort”, opendsa.cs.vt.edu/OpenDSA/Books/Catalog/html/Heapsort.html

Desene: Redactare proprie (desen original)

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.