Pe scurt
Sortarea prin interclasare împarte șirul în două, sortează fiecare jumătate, apoi le interclasează. Pentru , partea se sortează în , iar interclasarea ei cu dă . Spre deosebire de interclasarea simplă, intrarea inițială nu trebuie să fie sortată: apelurile recursive pregătesc jumătățile.
În detaliu
Sortarea prin interclasare (mergesort) este tot o aplicație a metodei divide et impera. Segmentul [st, dr] se împarte la mijloc, m = (st + dr) / 2; se sortează recursiv cele două jumătăți, [st, m] și [m+1, dr], apoi ele se interclasează într-un tablou auxiliar și rezultatul se copiază înapoi. Un segment cu un element este deja sortat, deci recursivitatea se oprește la st >= dr. Spre deosebire de interclasarea simplă, intrarea nu trebuie să fie sortată: apelurile recursive pregătesc jumătățile. Adâncimea împărțirii este aproximativ , iar pe fiecare nivel se interclasează în total elemente, deci timpul este în toate cazurile, indiferent de ordinea inițială. Memoria auxiliară este , pentru tabloul de interclasare. Dacă la egalitate se preia elementul din jumătatea stângă (<=), metoda este stabilă.
Exemplul 1 — tabloul . Se împarte în și . Jumătatea se împarte în și , care se interclasează în . Apoi și se interclasează: , apoi (pentru că ), apoi . Rezultatul este .
#include <iostream>
using namespace std;
int a[100], aux[100];
void sortare(int st, int dr) {
if (st >= dr) return;
int m = (st + dr) / 2;
sortare(st, m);
sortare(m + 1, dr);
int i = st, j = m + 1, k = st;
while (i <= m && j <= dr)
aux[k++] = (a[i] <= a[j] ? a[i++] : a[j++]);
while (i <= m) aux[k++] = a[i++];
while (j <= dr) aux[k++] = a[j++];
for (int p = st; p <= dr; ++p) a[p] = aux[p];
}
int main() {
a[0] = 5; a[1] = 2; a[2] = 4;
sortare(0, 2);
for (int i = 0; i < 3; ++i) cout << a[i] << " ";
return 0;
}
Programul afișează 2 4 5.
Exemplul 2 — tabloul . Primul apel împarte tabloul în și . Prima jumătate se sortează ca mai sus și devine ; a doua, deja sortată, rămâne . Interclasarea lor dă . În total se fac 11 comparații în interclasări și se copiază înapoi 16 elemente.
Exemplul 3 — numărul de pași. Pentru elemente există niveluri de interclasare. Pe fiecare nivel se prelucrează 8 elemente, deci se copiază de elemente, indiferent dacă tabloul inițial este sortat, aproape sortat sau sortat invers. Atât pentru , cât și pentru se fac 12 comparații, deoarece fiecare interclasare costă cât lungimea jumătății care se epuizează prima: . Numărul de copieri rămâne 24. Pentru sunt aproximativ de operații, față de aproximativ la metodele cu pași.
Stabilitatea și alegerea metodei. La egalitate, condiția a[i] <= a[j] preia elementul din jumătatea stângă, deci două elemente egale rămân în ordinea inițială; cu < ordinea lor s-ar inversa. Pentru că timpul nu depinde de datele de intrare, metoda este potrivită când se cere un timp garantat sau o sortare stabilă; în schimb cere memorie suplimentară proporțională cu , spre deosebire de sortarea rapidă și de cele trei metode simple, care sortează pe loc.
Exemplul 4 — urmărirea interclasărilor pentru . Segmentul se împarte până la elemente izolate, iar interclasările se fac în ordinea în care apelurile recursive revin:
- : dă ; : dă ; apoi : cu dă ;
- : dă ; : dă ; apoi : cu dă ;
- : cu dă .
Se fac 17 comparații și 24 de copieri înapoi în tablou, adică . Comparațiile depind de date (17 aici, 12 la un tablou sortat), copierile doar de .
Greșeli frecvente
- Greșit: sortarea prin interclasare cere ca tabloul să fie sortat de la început.Corect: ea sortează tabloul oarecare; interclasarea se aplică jumătăților deja sortate de apelurile recursive.
- Greșit: este o metodă care sortează pe loc, fără memorie suplimentară.Corect: folosește un tablou auxiliar de dimensiunea segmentului, deci memorie .
- Greșit: timpul depinde puternic de ordinea inițială.Corect: este în toate cazurile.
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 X intensiv; rocnee.eu
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
Documente consultate
- Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42); rocnee.eu
- Programa școlară de informatică, clasa a X-a (OMECI 5099/2009, anexa 5), CNCE; 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; edu.ro
Desene: Redactare proprie (desen original)
