Bubblesort_2

2
 Metoda bulelor (bubble-sor t)  Algoritmul constă în parcurgerea tabloului A de mai multe ori, până când devine or donat. La fiecare pas s e comp ară două elemente alăturate. Dacă ai  > ai + 1, (i  = 1, 2, ..., n   1), atunci cele două valori se interschimbă între ele. Controlul acţiunii repetitive este dat de variabila boole ană ok , ca re la fiecare reluare a algoritmului prim eşte valoarea iniţi ală adevărat , care se schimbă în  fals dacă s -a efectuat o inters chimbare de două ele men te alăturate. În momentul în care tabloul  A s -a parcurs fără să se mai efectuez e nici o schimbare, ok  răne cu valoarea iniţială adevărat  şi algoritmul se termină, deoarece ta bloul este ordonat. Inter schimbar ea a două elemente s e r ealizează prin inter mediul variabilei auxiliare aux  care are acela şi tip ca şi elemen tele tabloului.  Subalgoritm Metoda_bulelor (  A) 1: repeta 2: ok = adevărat  3: pentr u i=1, n- 1 execută 4: dacă a[i] > a[i+1] atunci  5: ok = fals 6: aux = a[i] 7: a[i] = a[i+1] 8: a[i+1] = aux 9: pana cand ok Considerăm tabloul  A cu 5 elemente numere reale: 0.0, 1.1, 1.0, 1.2 şi 0.08. Prima parcurgere a tabloului (ok  este iniţial izat cu adevărat ): a1 = 0.0 a2 = 1.1 a3 = 1.0 a4 = 1.2 a5 = 0.08 ok  0.0 1.0 1.1 1.2 0.08 als 0.0 1.0 1.1 0.08 1.2 als Valorile 0.0 < 1.1, rămân neschimbate, 1.1 > 1.0, le interschimbăm. Deoarece 1.1 < 1.2, avansăm şi constatăm că 1.2 > 0.0.8, deci din nou avem interschimbare. În consecinţă, la ieşire din structura pentru ok  este fals. Observăm că 1.2 a ajuns pe locul lui de fi nitiv. Urmează a doua parcurgere a tabloului (ok  primeşte din nou valoarea adevărat ). a1 = 0.0a2 = 1.0 a3 = 1.1 a4 = 0.08 a5 = 1.2ok  0.0 1.0 0.08 1.1 1.2 als Am avut interschimbare şi de data aceasta, deci ieşim cu ok  = fals. La aces t p as 1.1 a aj uns p e locul s ău definit iv. A treia par curgere a tabloului începe cu reiniţializarea lui ok  cu valoarea adevărat . a1 = 0.0a2 = 1.0 a3 = 0.08 a4 = 1.1 a5 = 1.2ok  0.0 0.08 1.0 1.1 1.2 als Am intersc himbat 0.08 cu 1.0, cel din ur mă as tfel a ajuns pe locul s ău în şirul or donat. A patra parcu rgere a tabloului se finali zează cu valoarea ok  = adevărat , deoarece nu am efectuat nici o intersc himbare, ceea ce îns eamnă că p rocesul de ordonare s -a încheiat. a1 = 0.0 a2 = 0.08 a3 = 1.0 a4 = 1.1 a5 = 1.2ok  0.0 0.08 1.0 1.1 1.2 adevărat  Observaţia cu pr ivire la faptu l c ă la fiecare par curgere a ajuns cel puţ in un element pe locul s ău definiti v în şirul o rdonat poate fi fructificată, deoarece constatăm că as t fel , la ur mător ul pas nu mai sunt necesare verific ările în care inter vine aces t element şi cele care s e află du pă el în şir.

description

dsada

Transcript of Bubblesort_2

  • Metoda bulelor (bubble-sort)

    Algoritmul const n parcurgerea tabloului A de mai multe ori, pn cnd devine ordonat. La fiecare pas se compar dou elemente alturate. Dac ai > ai + 1, (i = 1, 2, ..., n 1), atunci cele

    dou valori se interschimb ntre ele. Controlul aciunii repetitive este dat de variabila boolean

    ok, care la fiecare reluare a algoritmului primete valoarea iniial adevrat, care se schimb n fals dac s-a efectuat o interschimbare de dou elemente alturate. n momentul n care

    tabloul A s-a parcurs fr s se mai efectueze nici o schimbare, ok rmne cu valoarea iniial adevrat i algoritmul se termin, deoarece tabloul este ordonat.

    Interschimbarea a dou elemente se realizeaz prin intermediul variabilei auxiliare aux care are acelai tip ca i elementele tabloului.

    Subalgoritm Metoda_bulelor (A) 1: repeta

    2: ok = adevrat 3: pentru i=1,n-1 execut 4: dac a[i] > a[i+1] atunci 5: ok = fals 6: aux = a[i] 7: a[i] = a[i+1] 8: a[i+1] = aux 9: pana cand ok

    Considerm tabloul A cu 5 elemente numere reale: 0.0, 1.1, 1.0, 1.2 i 0.08. Prima parcurgere a

    tabloului (ok este iniializat cu adevrat):

    a1 = 0.0 a2 = 1.1 a3 = 1.0 a4 = 1.2 a5 = 0.08 ok

    0.0 1.0 1.1 1.2 0.08 fals

    0.0 1.0 1.1 0.08 1.2 fals

    Valorile 0.0 < 1.1, rmn neschimbate, 1.1 > 1.0, le interschimbm. Deoarece 1.1 < 1.2, avansm i constatm c 1.2 > 0.0.8, deci din nou avem interschimbare. n consecin, la ieire

    din structura pentru ok este fals. Observm c 1.2 a ajuns pe locul lui definitiv. Urmeaz a doua parcurgere a tabloului (ok primete din nou valoarea adevrat).

    a1 = 0.0 a2 = 1.0 a3 = 1.1 a4 = 0.08 a5 = 1.2 ok

    0.0 1.0 0.08 1.1 1.2 fals

    Am avut interschimbare i de data aceasta, deci ieim cu ok = fals. La acest pas 1.1 a ajuns pe locul su definitiv. A treia parcurgere a tabloului ncepe cu reiniializarea lui ok cu valoarea adevrat.

    a1 = 0.0 a2 = 1.0 a3 = 0.08 a4 = 1.1 a5 = 1.2 ok

    0.0 0.08 1.0 1.1 1.2 fals

    Am interschimbat 0.08 cu 1.0, cel din urm astfel a ajuns pe locul su n irul ordonat. A patra parcurgere a tabloului se finalizeaz cu valoarea ok = adevrat, deoarece nu am efectuat nici o interschimbare, ceea ce nseamn c procesul de ordonare s -a ncheiat.

    a1 = 0.0 a2 = 0.08 a3 = 1.0 a4 = 1.1 a5 = 1.2 ok

    0.0 0.08 1.0 1.1 1.2 adevrat

    Observaia cu privire la faptul c la fiecare parcurgere a ajuns cel puin un element pe locul su

    definitiv n irul ordonat poate fi fructificat, deoarece constatm c astfel, la urmtorul pas nu mai sunt necesare verificrile n care intervine acest element i cele care se afl dup el n ir.

  • Rezult c la fiecare parcurgere am putea micora cu 1 numrul elementelor verificate. Astfel, ajungem la urmtorul subalgoritm mbuntit ca performan:

    Subalgoritm Metoda_bulelor (A)

    1: k=n {k va fi limita superioara pana unde se interschimba elemente} 2: repeta

    3: ok = adevrat 4: pentru i=1,k-1 execut

    5: dac a[i] > a[i+1] atunci 6: ok = fals

    7: aux = a[i] 8: a[i] = a[i+1]

    9: a[i+1] = aux 10: j=i 11: k=j; {ultimul indice pentru care s-a facut interchimbare} 12: pana cand ok

    Metoda bulelor nu este cea mai performant modalitate de a ordona un ir cu multe elemente, dar n cazul irurilor aproape ordonate, cu optimizrile de mai sus, poate deveni mai eficient dect alte metode. Pentru a analiza timpul de execuie al metodei bulelor trebuie s lum n considerare 3 mrimi:

    1. numrul de treceri (parcurgeri)

    2. numrul de interschimbri 3. numrul de comparaii Dac presupunem c valorile de intrare reprezint o permutare a mulimii {1, 2, ..., n} putem uor descrie efectul fiecrei treceri astfel: dac un element ai nu are nici un precedent mai mare el va rmne pe loc, iar daca are cel puin unul mai mare atunci el se va muta cu o poziie mai n fa. Reamintesc c elementul maxim de la fiecare parcurgere va ajunge pe poziia final. Astfel, eficiena metodei bulelor depinde de numrul de inversiuni din permutarea iniial (fa de permutarea final, cea identic). Voi defini n continuare inversiunea i proprietile

    inversiunilor. Definiie: Fie a1, a2, ... an o permutare a mulimii {1, 2, ..., n}. Dac iaj, atunci perechea

    (ai, aj) se numete inversiunii a permutrii. De exemplu, n permutarea 3,1,4,2 se gsesc 3 inversiuni: (3,1), (3,2) i (4,2).

    Observaie: Singura permutare fr inversiuni este cea ordonat (identic) 1,2,...,n. Cazul cel mai favorabil este acela n care datele iniiale sunt ordonate cresctor, caz n care se

    face o singur parcurgerea a datelor.

    Cazul cel mai nefavorabil este cel n care datele sunt sortate descresctor, caz n care se vor face n-1 parcurgeri. La prima parcurgere se vor face n-1 interschimbri, la a doua n-2 i aa mai

    departe. Aadar numrul de comparaii i cel de interschimbri va fi n(n-1)/2. Exemplu n acest caz:

    Numrul parcurgerii

    a1 a2 a3 a4 Numrul de interschimbri

    iniial 4 3 2 1

    1 3 2 1 4 3

    2 2 1 3 4 2

    3 1 2 3 4 1

    Total interschimbri 6

    Astfel, vom spune c metoda bulelor are un timp de execuie n cazul cel mai defavorabil de

    (n2).