Selecția minimului, sortarea cu listă de frecvențe și metoda bulelor — cele trei metode din programă. Și marea întrebare: câte comparări face fiecare?
La fiecare pas: caută cel mai mic element din zona nesortată și interschimbă-l cu primul element al ei. Repetă până totul e verde.
Când valorile sunt într-un interval mic și cunoscut (note 1–10, cifre 0–9): construiești f[] (Modulul 08!), apoi recompui vectorul scriind fiecare valoare de f[v] ori. Zero comparări.
Compari mereu doi vecini; dacă-s în ordine greșită, îi interschimbi. La fiecare trecere, cel mai mare „urcă" la suprafață ca o bulă. Dacă o trecere nu face nicio interschimbare — gata, e sortat!
Ambele au ~n²/2 comparări în cel mai rău caz. Diferența apare pe vectori „prietenoși" — testează toate scenariile!
Ai văzut că selecția face mereu multe comparări, iar bulele se pot opri devreme. Dar cum PUNEM cifre pe „mult" și „puțin"? Cu Big-O. O luăm de la capăt.
Un calculator face pași simpli: o adunare, o comparație, un acces la v[i] — fiecare durează cam la fel, aproape instantaneu. Big-O nu măsoară SECUNDE (depind de calculator), ci câți pași faci când datele cresc. Notăm cu n mărimea datelor (câte elemente are vectorul) și numărăm cum crește munca odată cu n.
Nu contează dacă n = 10 sau n = 1.000.000 — accesul direct la o poziție e la fel de rapid. Timp CONSTANT.
Un for peste tot vectorul = n pași. Dublezi n → dublezi timpul. Aici stau suma, minimul, frecvențele.
Buclă ÎN buclă: pentru fiecare din cei n, încă n pași. Dublezi n → de 4 ori mai mult timp! Aici stau selecția și bulele.
La fiecare pas ÎNJUMĂTĂȚEȘTI. n = 1000 → doar ~10 pași! Aici stă Euclid cu împărțiri (M03), iar la anul căutarea binară.
De ce scară logaritmică pe verticală? Pe o scară normală, O(n²) ar strivi toate celelalte linii la podea (nu s-ar vedea nimic). Aici fiecare treaptă în sus = ×10 operații — așa încap TOATE cele 5 curbe, clar separate. Punctul din grafic = exact rândul din tabel.
| Complexitate | Exemplu | operații la n ales | creștere |
|---|
Sortările, la pachet.
Ordonați crescător un vector — implementează selecția sau bulele, de mână.
Rezolvă pe pbinfo.ro →Afișați numerele de ordine ale copiilor în ordinea înălțimii — sortare care ține minte poziția inițială.
Rezolvă pe pbinfo.ro →Sortați un vector crescător — de data asta cu sort() din bibliotecă, pentru comparație.
Rezolvă pe pbinfo.ro →Cifra cea mai frecventă — vectorul de frecvențe în acțiune (M08 + M09).
Rezolvă pe pbinfo.ro →