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
Cand primesti carti de joc, le aranjezi in mana in ordine (2, 3, 4, ..., A). Faci asta automat: compari doua carti, daca sunt in ordine gresita le interschimbi. Exact asta face Bubble Sort!
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.
Citim n numere, le sortam si le afisam
In practica, nu scriem valorile direct in cod. Le citim de la tastatura: