De ce conteaza sortarea?
Sortarea inseamna aranjarea elementelor unui tablou intr-o ordine logica: de la mic la mare (crescator) sau de la mare la mic (descrescator).
Sortarea este una dintre cele mai importante operatii in informatica. Gandeste-te:
- Dictionarul - cuvintele sunt sortate alfabetic, altfel nu ai gasi niciodata nimic
- Catalogul scolar - elevii sunt sortati alfabetic dupa nume
- Clasament sportiv - echipele sunt sortate dupa punctaj
- Preturile pe un site - sortezi produsele de la ieftin la scump
- Notele la examen - profesorul le sorteaza pentru a calcula statistici
Imagineaza-ti mai multe bule de aer de marimi diferite intr-un pahar cu apa. La fiecare moment, bula cea mai mare pluteste spre suprafata, impingand-o pe cea mai mica sub ea. Exact asa functioneaza Bubble Sort: la fiecare trecere prin tablou, comparam fiecare pereche de vecini si, daca sunt in ordine gresita, le interschimbam — astfel cel mai mare element "pluteste" spre sfarsitul tabloului, ca o bula de aer care urca in apa.
Nota: Cand oamenii sorteaza carti in mana, ei folosesc intuitiv un algoritm diferit — iau o carte si o introduc la locul potrivit intre celelalte (acela se numeste Insertion Sort). Bubble Sort este un algoritm sistematic pe care calculatoarele il pot executa eficient pas cu pas, dar oamenii il folosesc rar in mod natural.
Cum interschimbam doua valori?
Inainte de a invata sortarea, trebuie sa stim cum interschimbam (swap) doua valori. Nu putem face direct a = b; b = a; pentru ca am pierde valoarea lui a!
Avem nevoie de o variabila temporara (temp) - ca un pahar gol in care punem temporar o valoare.
Ai un pahar cu suc de portocale (A) si un pahar cu suc de mere (B). Vrei sa le interschimbi. Nu poti turna A in B direct (se amesteca!). Ai nevoie de un pahar gol (temp): torni A in paharul gol, apoi B in A, apoi din paharul gol in B. Gata!
Algoritmul Bubble Sort
Bubble Sort (sortarea prin metoda bulelor) functioneaza astfel:
- Parcurgem tabloul de la stanga la dreapta
- Comparam fiecare element cu vecinul sau din dreapta
- Daca sunt in ordine gresita, le interschimbam
- Repetam de la pas 1 pana cand totul e sortat
De ce se numeste "Bubble" (bula)? Pentru ca la fiecare trecere, cel mai mare element "pluteste" in sus (spre sfarsitul tabloului), ca o bula de aer care urca in apa!
Programul complet: Bubble Sort crescator
Sa punem totul impreuna. Urmareste fiecare linie si rolul ei:
Un singur caracter face diferenta!
Pentru a schimba directia sortarii, modifici doar operatorul de comparatie din conditia if:
Crescator = vrem cele mici in fata, deci mutam cele mari spre sfarsit → folosim >
Descrescator = vrem cele mari in fata, deci mutam cele mici spre sfarsit → folosim <
Regula n - 1 treceri
Pentru un tablou de n elemente, Bubble Sort face maxim n - 1 treceri.
De ce? Pentru ca la fiecare trecere, cel putin un element ajunge la locul lui final. Dupa n-1 elemente asezate corect, ultimul este automat la locul lui.
| n (elemente) | Treceri (n-1) | Comparatii totale (cel mai rau caz) |
|---|---|---|
| 3 | 2 | 2 + 1 = 3 |
| 5 | 4 | 4 + 3 + 2 + 1 = 10 |
| 10 | 9 | 9 + 8 + ... + 1 = 45 |
| 100 | 99 | 99 + 98 + ... + 1 = 4950 |
Dupa trecerea 1, ultimul element e sortat. Dupa trecerea 2, ultimele 2 sunt sortate. Dupa trecerea p, ultimele p elemente sunt sortate. Deci nu mai avem nevoie sa le comparam!
De aceea scriem i < n - 1 - p si nu i < n - 1. Functioneaza si cu i < n - 1, dar face comparatii inutile.
Bubble Sort este cel mai simplu de inteles, dar si cel mai lent pentru liste mari (face multe comparatii inutile). In informatica exista multi alti algoritmi de sortare, fiecare cu avantaje proprii:
- Selection Sort — la fiecare trecere gaseste minimul si il pune pe locul corect
- Insertion Sort — ia pe rand fiecare element si il insereaza la locul potrivit (asa sorteaza oamenii cartile in mana!)
- Quick Sort — divide tabloul in doua parti si sorteaza recursiv; folosit in practica
Acestea sunt subiecte de aprofundare pentru cine vrea sa mearga mai departe (liceu, concursuri). Deocamdata, Bubble Sort este suficient pentru a intelege principiul sortarii.
Citim n numere, le sortam si le afisam
In practica, nu scriem valorile direct in cod. Le citim de la tastatura: