Biblioteca
Tutora
BibliotecaInformatică și TIC › clasa a VIII-a

Algoritmi de sortare și căutare

Elevii studiază principalii algoritmi de sortare și căutare și le analizează eficiența.

Evaluarea Națională

De ce sortăm și ce înseamnă o sortare

A sorta un vector înseamnă a-i rearanja elementele în ordine crescătoare sau descrescătoare. Sortarea e una dintre cele mai studiate probleme din informatică pentru că datele ordonate se prelucrează incomparabil mai ușor: minimul e primul element, maximul e ultimul, valorile egale stau grupate, iar căutarea binară devine posibilă.

Toate metodele studiate în gimnaziu au același schelet: comparații între elemente și interschimbări (schimbarea a două valori între ele, cu variabilă auxiliară: aux = v[i]; v[i] = v[j]; v[j] = aux;).

Ce le deosebește este STRATEGIA — cine cu cine se compară și când se mută:

Pentru a sorta descrescător, nu inventezi altă metodă — inversezi doar sensul comparației (cauți maximul în loc de minim, schimbi vecinii când cel din stânga e mai MIC).

La evaluare, cerința tipică nu e să scrii sortarea din memorie, ci să urmărești ce conține vectorul după un anumit număr de pași sau treceri — de aceea trebuie să știi exact ce garantează fiecare metodă după fiecare etapă.

Sortarea prin selecție

Ideea selecției e cea mai naturală: la fiecare pas selectezi minimul din porțiunea rămasă nesortată și îl aduci la începutul ei.

Pașii pentru un vector cu n elemente:

Garanția-cheie, care se cere la itemii de urmărire: după pasul k, primele k elemente sunt cele mai mici k valori ale vectorului, deja în ordine finală. Zona din stânga e „închisă” — nu se mai atinge.

Exemplu pe v = (5, 2, 4, 1): după pasul 1 → (1, 2, 4, 5)... atenție, să-l facem corect: minimul e 1, se interschimbă cu 5 → (1, 2, 4, 5). Aici vectorul arată sortat din întâmplare, dar algoritmul CONTINUĂ mecanic pașii 2 și 3, chiar dacă nu mai schimbă nimic — algoritmii nu „văd” că au terminat, execută toți pașii prescriși.

Numărul de comparații nu depinde de datele inițiale: mereu (n−1) + (n−2) + ... + 1 comparații, aproximativ n·n/2 — deci selecția e la fel de „lentă” și pe un vector deja sortat. În schimb, numărul de INTERSCHIMBĂRI e mic: cel mult una pe pas, maximum n−1 în total — punct forte al metodei.

Sortarea prin inserție

Inserția funcționează exact cum îți aranjezi cărțile de joc în mână: ții în stânga o parte deja ordonată și fiecare carte nouă o strecori la locul ei.

Pașii: presupui că v[1] formează singur o zonă sortată. Iei pe rând v[2], v[3], ..., v[n]; pe fiecare îl compari cu vecinii din zona sortată, deplasezi spre dreapta elementele mai mari decât el și îl inserezi în golul creat.

Exemplu pe v = (4, 3, 5, 1):

Diferența subtilă față de selecție, vânată la teste: după pasul k, la inserție primele k elemente sunt ordonate între ele, dar NU sunt neapărat cele mai mici k valori din vector (în exemplu, după pasul 2 zona sortată era (3, 4, 5), dar valoarea 1 — cea mai mică — încă aștepta afară). La selecție, zona sortată conține garantat cele mai mici valori, în poziții definitive.

Eficiența inserției depinde de date: pe un vector deja sortat face doar n−1 comparații și nicio deplasare — cel mai bun caz; pe un vector sortat invers face maximum de muncă. De aceea inserția e preferată când datele sunt „aproape sortate”.

Sortarea prin interschimbare (bubble sort)

Metoda bulelor compară mereu perechi de elemente vecine: dacă v[i] > v[i+1], le interschimbă. O trecere completă prin vector plimbă valorile mari spre dreapta — cea mai mare valoare „urcă” precum o bulă de aer până pe ultima poziție.

Garanția după fiecare trecere: la finalul trecerii k, ultimele k elemente sunt cele mai mari k valori, definitiv așezate. Zona finală se construiește de la coadă spre început — invers față de selecție.

Algoritmul se oprește când o trecere întreagă se încheie fără nicio interschimbare — semn că vectorul e sortat. Implementarea folosește o variabilă-semafor (de exemplu ok): o pui pe „adevărat” la începutul trecerii și o faci „fals” la orice interschimbare; repeți trecerile cât timp s-a schimbat ceva.

Exemplu, o trecere pe v = (3, 1, 4, 2):

După prima trecere, 4 (maximul) e definitiv pe ultima poziție, dar vectorul NU e încă sortat — mai e nevoie de o trecere pentru perechea (3, 2). Întrebarea-capcană standard: „este vectorul sortat după o singură trecere?” — de regulă NU; o trecere garantează doar poziția maximului.

Pe vector deja sortat, bubble sort cu semafor face o singură trecere de verificare și se oprește — avantaj față de selecție.

Căutarea secvențială și căutarea binară

Căutarea secvențială (liniară) parcurge vectorul element cu element și compară fiecare valoare cu cea căutată. Se oprește la prima potrivire sau după ultimul element. Funcționează pe orice vector, sortat sau nu. În cel mai rău caz (element pe ultima poziție sau inexistent) face n comparații.

Căutarea binară cere OBLIGATORIU vector sortat — condiție care se pierde des din vedere și costă punctajul întreg. Mecanismul: ții două capete, st și dr; calculezi mijlocul m = (st + dr) / 2; compari v[m] cu valoarea căutată x:

Repeți cât timp st <= dr; dacă intervalul se golește, x nu există în vector.

Exemplu pe v = (2, 5, 8, 11, 14, 17, 20), căutăm 17: mijlocul e 11 → 17 > 11, mergem în dreapta; noul mijloc e 17 → găsit în 2 comparații, față de 6 la secvențială.

Puterea metodei: fiecare comparație înjumătățește intervalul, deci pentru n = 1000 ajung circa 10 comparații, pentru un milion — circa 20. Dublarea datelor adaugă O SINGURĂ comparație în plus.

Judecata de eficiență cerută la subiecte: dacă faci o singură căutare într-un vector nesortat, secvențiala e alegerea corectă (sortarea ar costa mai mult decât economisește); dacă faci MULTE căutări, merită să sortezi o dată și apoi să cauți binar.

De reținut

sortare
rearanjarea elementelor unui tablou în ordine crescătoare sau descrescătoare prin comparații și interschimbări
sortare prin selecție
metodă care la pasul k selectează minimul zonei nesortate și îl interschimbă cu elementul de pe poziția k; după pasul k, primele k elemente sunt cele mai mici, în poziții definitive
sortare prin inserție
metodă care extinde pas cu pas o zonă sortată, inserând fiecare element nou la locul potrivit prin deplasarea spre dreapta a elementelor mai mari
sortare prin interschimbare (bubble sort)
metodă care compară repetat elemente vecine și le interschimbă când sunt în ordine greșită, până la o trecere completă fără interschimbări
trecere
o parcurgere completă a vectorului în cadrul sortării prin interschimbare; după trecerea k, ultimele k elemente sunt definitiv așezate
căutare secvențială
compararea pe rând a fiecărui element cu valoarea căutată, aplicabilă pe orice vector; în cel mai rău caz face n comparații
căutare binară
căutare pe vector sortat care compară valoarea cu elementul din mijloc și elimină la fiecare pas jumătate din interval
interschimbare
schimbarea valorilor a două elemente între ele, realizată cu o variabilă auxiliară în trei atribuiri

Greșeli frecvente

Greșit: Aplicarea căutării binare pe un vector nesortat
Corect: Condiția obligatorie a căutării binare este vectorul sortat; fără ea, eliminarea jumătăților de interval nu mai e corectă și rezultatul e întâmplător
Greșit: Confundarea garanțiilor: la inserție, primele k elemente ar fi cele mai mici din vector
Corect: La inserție primele k elemente sunt doar ordonate ÎNTRE ELE; abia la selecție primele k sunt cele mai mici valori, în poziții definitive
Greșit: Afirmația că după o trecere bubble sort vectorul este sortat
Corect: O trecere garantează doar că MAXIMUL a ajuns pe ultima poziție; sortarea completă poate cere până la n−1 treceri
Greșit: Numărarea greșită a comparațiilor la selecție pe un vector deja sortat
Corect: Selecția face același număr de comparații indiferent de date — aproximativ n·n/2; doar interschimbările pot lipsi
Greșit: Sortarea descrescătoare tratată ca metodă separată de învățat
Corect: Se folosește aceeași metodă cu sensul comparației inversat: se caută maximul în loc de minim, respectiv se schimbă vecinii când cel din stânga e mai mic

Test — 6 întrebări ca la examen

1. Ce condiție trebuie să îndeplinească un vector pentru a putea aplica pe el căutarea binară?
  1. să aibă un număr par de elemente
  2. să conțină doar valori distincte
  3. să fie sortat
  4. să aibă cel puțin 10 elemente
Vezi răspunsul
să fie sortat. Căutarea binară elimină jumătăți de interval pe baza comparației cu mijlocul, raționament valid doar dacă elementele sunt ordonate. Valorile distincte — distractorul tentant — nu sunt necesare: metoda găsește una dintre apariții și pe vectori cu dubluri.
2. Vectorul v = (7, 3, 9, 1, 5) se sortează crescător prin selecție. Cum arată vectorul după PRIMUL pas?
  1. (3, 7, 9, 1, 5)
  2. (1, 3, 9, 7, 5)
  3. (1, 7, 9, 3, 5)
  4. (3, 7, 1, 9, 5)
Vezi răspunsul
(1, 7, 9, 3, 5). Selecția găsește minimul întregului vector (1, aflat pe poziția 4) și îl INTERSCHIMBĂ cu primul element: 7 pleacă pe locul lui 1 → (1, 7, 9, 3, 5). Varianta (1, 3, 9, 7, 5) e capcana: presupune că restul elementelor se rearanjează, dar selecția face o singură interschimbare pe pas.
3. Vectorul v = (2, 4, 6, 8) este deja sortat crescător. Care metodă profită cel mai mult de acest lucru, oprindu-se după o singură trecere de verificare?
  1. sortarea prin selecție
  2. sortarea prin interschimbare cu variabilă-semafor
  3. sortarea prin selecție cu maxim în loc de minim
  4. nicio metodă nu poate detecta că vectorul e sortat
Vezi răspunsul
sortarea prin interschimbare cu variabilă-semafor. Bubble sort cu semafor observă că trecerea s-a încheiat fără nicio interschimbare și se oprește imediat. Selecția — distractorul — execută mecanic toate cele n−1 pasuri cu toate comparațiile, indiferent că vectorul era sortat de la început.
4. Asupra vectorului v = (5, 1, 4, 2) se efectuează O SINGURĂ trecere de bubble sort (comparări de vecini, crescător). Rezultatul este:
  1. (1, 2, 4, 5)
  2. (1, 4, 2, 5)
  3. (1, 5, 4, 2)
  4. (5, 1, 4, 2)
Vezi răspunsul
(1, 4, 2, 5). Perechea (5,1) se schimbă → (1,5,4,2); apoi (5,4) se schimbă → (1,4,5,2); apoi (5,2) se schimbă → (1,4,2,5). Maximul 5 a ajuns definitiv la coadă, dar vectorul nu e sortat — varianta (1,2,4,5), capcana, presupune greșit că o trecere încheie sortarea.
5. În vectorul sortat v = (1, 4, 7, 10, 13, 16, 19), se caută binar valoarea 16. Care este PRIMUL element cu care se compară 16?
  1. 1
  2. 10
  3. 16
  4. 19
Vezi răspunsul
10. Căutarea binară începe mereu cu elementul din MIJLOC: pozițiile 1–7 dau mijlocul (1+7)/2 = 4, adică valoarea 10. Abia după ce constată 16 > 10 se mută în jumătatea dreaptă. Varianta 1 descrie startul căutării secvențiale, nu al celei binare.
6. Un vector are 1 000 000 de elemente sortate. Aproximativ câte comparații face căutarea binară în cel mai rău caz?
  1. 1 000 000
  2. 500 000
  3. 1000
  4. 20
Vezi răspunsul
20. Fiecare comparație înjumătățește intervalul, iar un milion se înjumătățește de circa 20 de ori până ajunge la 1 (2 la puterea 20 e cam un milion). Varianta 500 000 e capcana intuitivă „jumătate din elemente” — dar înjumătățirea e repetată, nu unică.
Deschide varianta interactivă — cu AI care îți explică
← Structuri de date avansateTehnici de programare →
BiologieChimieEconomieFilosofieFizicăGeografieInformatică și TICIstorieLogică și argumentareMatematicăPsihologieLimba și literatura română