Compari vecini
Identifici perechi de elemente adiacente aflate în ordine greșită.
Metoda bulelor: principiu, implementare și urmărirea etapelor
Identifici perechi de elemente adiacente aflate în ordine greșită.
Explici cum o parcurgere deplasează maximul spre dreapta.
Scrii metoda bulelor în pseudocod și Python.
Utilizezi variabila schimbat și testezi cazuri diferite.
Care este ideea centrală a lecției?
Metoda bulelor compară elemente aflate pe poziții consecutive. Dacă sunt în ordine greșită, le interschimbă. Repetând parcurgerile, valorile mari se deplasează spre dreapta.
La sortarea crescătoare comparăm a[j] cu a[j+1]. Dacă a[j] > a[j+1], interschimbăm cele două valori. După o parcurgere completă, cea mai mare valoare din zona analizată ajunge la final.
Variabila schimbat pornește cu False. Dacă apare cel puțin o interschimbare, devine True. Dacă la sfârșitul unei parcurgeri rămâne False, lista era deja sortată și putem opri.
Imaginează-ți că ai persoane așezate într-un rând după înălțime. Compari fiecare două persoane vecine; dacă cea din stânga este mai înaltă decât cea din dreapta, le schimbi locurile. După o parcurgere, valoarea cea mai mare din zona analizată ajunge la dreapta. Procesul nu se oprește aici: parcurgerile se repetă atât timp cât lista nu este sortată. Cu oprire anticipată, algoritmul se poate opri când într-o parcurgere nu s-a realizat nicio interschimbare.
Pornim de la [5, 2, 4, 1]. La fiecare apăsare se execută o singură comparație. Sunt afișate comparația, decizia, lista rezultată și parcurgerea curentă.
[5, 2, 4, 1]Parcurgerea 1: începem cu prima pereche de vecini.
Observă că, după prima parcurgere, lista este [2, 4, 1, 5], dar nu este încă sortată. Urmează o nouă parcurgere.
Nu există încă pași.
Varianta de bază:
a = [5, 2, 4, 1]
n = len(a)
for i in range(n - 1):
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
print(a)
Varianta cu oprire anticipată:
a = [5, 2, 4, 1]
n = len(a)
for i in range(n - 1):
schimbat = False
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
schimbat = True
if not schimbat:
break
print(a)
Algoritm Bule
citește lista a și n
pentru i ← 0, n - 2 execută
schimbat ← fals
pentru j ← 0, n - 2 - i execută
dacă a[j] > a[j+1] atunci
interschimbă a[j] cu a[j+1]
schimbat ← adevărat
sfârșit dacă
sfârșit pentru
dacă schimbat = fals atunci
oprește repetarea
sfârșit dacă
sfârșit pentru
SFÂRȘIT ALGORITM
a[j] < a[j+1].Sortează crescător lista [8,3,6,2,5] prin metoda bulelor și afișează lista după fiecare parcurgere.
La fiecare parcurgere comparăm perechi consecutive. Când perechea este descrescătoare, o interschimbăm. După prima parcurgere, maximul ajunge la final.
a = [8, 3, 6, 2, 5]
n = len(a)
for i in range(n - 1):
schimbat = False
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
schimbat = True
print(a)
if not schimbat:
break
Parcurgerea 1: [3,6,2,5,8]. Parcurgerea 2: [3,2,5,6,8]. Parcurgerea 3: [2,3,5,6,8]. Parcurgerea 4 nu mai schimbă nimic, deci algoritmul se oprește.
Caz normal: [8,3,6,2,5]; caz-limită: [4]; caz particular: [2,2,2]; caz deja sortat: [1,2,3,4,5]; caz descrescător: [5,4,3,2,1].
Dacă a[j] > a[j+1], interschimbarea elimină inversiunea dintre vecini. După o parcurgere, cea mai mare valoare din zona analizată ajunge la dreapta. În cazul nefavorabil timpul este O(n²), iar cu oprire anticipată cazul favorabil poate fi O(n).
1. Ce se compară?
2. Ce indică schimbat?
3. Ce ajunge la final după prima parcurgere?
4. Pentru sortare descrescătoare condiția este:
5. Care poate fi cazul favorabil cu oprire anticipată?
6. Care este ordinul general al timpului?
citește înălțimile a n elevi și sortează-le crescător prin metoda bulelor. Afișează lista inițială, lista după fiecare parcurgere, numărul de comparații și interschimbări. Include oprirea anticipată și cel puțin patru teste.
Recitește algoritmul, verifică testele și justifică alegerea metodei.