Didaxis
lecție · Informatică

Sortarea prin selecție

Alegerea minimului și plasarea sa.

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

Pe scurt

Sortarea prin selecție fixează pe rând fiecare poziție. Pentru poziția curentă, caută minimul în partea încă nesortată și îl schimbă cu elementul de pe poziția curentă. Din , selectează 2 și obține ; apoi selectează 4 și obține .

În Python, min([5,2,4]) găsește 2, valoarea aleasă pentru prima poziție a sortării prin selecție.

Desen la lecția „Sortarea prin selecție”
2în detaliustratul 2 din 3 · pentru clasă și Bacalaureat

În detaliu

Sortarea prin selecție construiește rezultatul de la stânga la dreapta. La pasul , partea din stânga, de la poziția 0 la , este deja sortată și conține cele mai mici valori. În partea rămasă se caută minimul și poziția lui k, apoi acest minim se schimbă cu elementul de pe poziția . După pași tabloul este sortat; ultimul element ajunge de la sine pe locul lui. Căutarea minimului cere comparații la pasul , deci în total comparații, indiferent de ordinea inițială. Numărul de schimburi este cel mult , mai mic decât la alte metode simple. Memoria auxiliară este constantă. Cu schimbul simplu, metoda nu este stabilă.

Exemplul 1 — tabloul .

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int v[] = {5, 2, 4, 1, 3}, n = 5;
    for (int i = 0; i < n - 1; ++i) {
        int k = i;
        for (int j = i + 1; j < n; ++j)
            if (v[j] < v[k]) k = j;
        swap(v[i], v[k]);
        for (int x : v) cout << x << ' ';
        cout << '\n';
    }
    return 0;
}

După fiecare pas, tabloul este: 1 2 4 5 3 (minimul 1 de pe poziția 3 se schimbă cu 5), apoi 1 2 4 5 3 (minimul 2 este deja pe poziția 1, schimbul nu modifică nimic), apoi 1 2 3 5 4 (minimul 3 de pe poziția 4 se schimbă cu 4) și în final 1 2 3 4 5. Comparațiile sunt , iar schimburile care mută efectiv un element sunt 3. Prefixul sortat crește cu un element la fiecare pas.

Exemplul 2 — varianta în Python și ordinea descrescătoare. Poziția minimului din secvența rămasă se obține cu min(range(i, n), key=lambda t: v[t]). Pentru ordine descrescătoare se caută maximul, iar comparația v[j] < v[k] devine v[j] > v[k]. Pentru în ordine descrescătoare rezultă : la maximul 5 este deja pe loc, la maximul 4 se schimbă cu 2.

v = [5, 2, 4]
n = len(v)
for i in range(n - 1):
    k = max(range(i, n), key=lambda t: v[t])
    v[i], v[k] = v[k], v[i]
print(v)

Programul afișează [5, 4, 2]. Atribuirea v[i], v[k] = v[k], v[i] schimbă valorile fără variabilă ajutătoare.

Exemplul 3 — instabilitatea. Fie elementele , și , în această ordine, sortate crescător după valoare. La primul pas minimul 1, aflat pe poziția 2, se schimbă cu de pe poziția 0: rezultă . Elementele egale și-au inversat ordinea relativă. Dacă ele au și alte câmpuri, rezultatul poate fi nedorit; când ordinea lor contează, se alege o metodă stabilă, de pildă inserția. Pentru selecția face 499 500 de comparații, dar cel mult 999 de schimburi.

Invariantul și cazul unui tablou descrescător. Invariantul sortării prin selecție este: înaintea pasului , primele poziții conțin cele mai mici valori ale tabloului, în ordine crescătoare. De aceea ciclul exterior nu revine niciodată asupra lor și se oprește la . Pentru tabloul descrescător , stările după cei trei pași sunt 1 3 2 4, 1 2 3 4 și 1 2 3 4. La ultimul pas minimul 3 se află deja pe poziția 2, deci schimbul nu modifică tabloul. Comparațiile sunt , la fel ca pentru orice alt tablou cu patru elemente, dar schimburile efective sunt doar 2. Numărul comparațiilor nu depinde de date, iar cel al schimburilor depinde, fără să depășească .

3pentru admiterestratul 3 din 3 · pentru examene

Pentru admitere

Urmărește indicele minimului, nu doar valoarea lui. La fiecare iterație exterioară, partea din stânga este deja sortată și nu mai intră în căutarea minimului. Dacă bucla interioară începe la j = i în loc de i + 1, comparația suplimentară a elementului cu el însuși nu schimbă rezultatul, dar dacă începe mai târziu poate rata minimul. Când un subiect cere starea tabloului după iterații, oprește urmărirea după exact schimburi, nu după comparații.

Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?

int v[] = {4, 3, 5, 1, 2};
for (int i = 0; i < 2; i++) {
    int k = i;
    for (int j = i + 1; j < 5; j++)
        if (v[j] < v[k]) k = j;
    swap(v[i], v[k]);
}
for (int i = 0; i < 5; i++)
    cout << v[i] << ' ';
  • a) 1 2 3 4 5
  • b) 1 2 5 4 3
  • c) 1 3 5 4 2
  • d) 3 4 5 1 2

Răspunsul corect este b). Ciclul exterior face doar două iterații. Pentru minimul 1 de pe poziția 3 se schimbă cu 4: 1 3 5 4 2. Pentru minimul din restul tabloului este 2, de pe poziția 4, și se schimbă cu 3: 1 2 5 4 3. Restul tabloului rămâne nesortat. Varianta a) ar fi rezultatul după toate cele patru iterații, iar varianta c) este starea după prima iterație.

Al doilea exemplu — numărul de schimburi efective. Ce valoare are la sfârșitul secvenței?

int v[] = {6, 2, 5, 1}, k = 0;
for (int i = 0; i < 3; i++) {
    int m = i;
    for (int j = i + 1; j < 4; j++)
        if (v[j] < v[m]) m = j;
    if (m != i) { swap(v[i], v[m]); k++; }
}
cout << k;

La minimul 1 se află pe poziția 3 și se schimbă cu 6: 1 2 5 6, iar . La și minimul se află chiar pe poziția curentă, deci și nu se mai schimbă nimic. Se afișează 1. Verifică și condiția ciclului exterior: pentru patru elemente, i < 3 este suficient, pentru că ultimul element ajunge de la sine pe locul lui.

Greșeli frecvente

  • Greșit: la fiecare pas se schimbă primul element cu al doilea, dacă sunt în ordine greșită.
    Corect: se caută minimul din partea nesortată și se schimbă cu elementul de pe poziția curentă.
  • Greșit: selecția face mai puține comparații pe date deja sortate.
    Corect: face același număr, .
  • Greșit: sortarea prin selecție cu schimb simplu păstrează ordinea elementelor egale.
    Corect: nu este stabilă în general.
î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:

  • 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 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)

lecțiile sunt gratuite

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