Sunteți pe pagina 1din 7

SORTARE PRIN METODA BULELOR (BUBBLE SORT)

Autor: prof. Neli Secit


PREZENTAREA METODEI
Prin metoda de sortare prin metoda buleleor se parcurge vectorul i se compar fiecare element
cu succesorul su. Dac nu sunt n ordine cele dou elemente, acestea se interschimb ntre ele. La
prima parcurgere elementul de valoare maxim se deplaseaz ctre ultima poziie. La a doua
parcurgere, elementul imediat urmtor ca valoare dup elementul maxim se deplaseaz ctre penultima
poziie. Vectorul se parcurge de mai multe ori, pn cnd la o parcurgere complet nu se mai execut
nici o interschimbare ntre elemente, nici o deplasare.
PREZENTAREA ALGORITMULUI
Algoritmul de sortarea prin metoda bulelor va sorta elementele din vectorul v1, v2 ,...,vn astfel
nct dup sortare, acestea vor fi n ordinea v1 v2 ... vn.
Ne propunem s facem o ordonare cresctoare a vectorului v1, v2 ,...,vn. Algoritmul const n
parcurgerea tabloului v de mai multe ori, pn cnd devine ordonat. La fiecare pas se compar dou
elemente consecutive vi i vi+1 . Dac vi > vi+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, i care se schimb n fals dac s-a efectuat o
interschimbare de dou elemente consecutive. n momentul n care tabloul v 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(v,n)
repet
ok < adevrat
pentru i=l,n-l
execut
dac v[i]>v[i+l]atunci
ok fals
aux v[i]
v[i] v[i+1]
v[i+l] aux
sfrit dac
sfrit pentru
pn cnd ok
sfrit subalgoritm

Exemplu

Trecerea 1

Trecerea 2

Trecerea 3

Trecerea 4

Trecerea 5

Trecerea 6

Considerm un vector v cu 10 elemente: 128, 77, 907, 407, 372, 478, 553, 348, 237, 878.
Figura 1 prezentat mai jos arat aciunea metodei asupra celor 10 elemente ale vectorului v1, v2
,...,v10. Elementele vectorului sunt reprezentate pe vertical, nu pe orizontal, cu v10 n vrf i v1 la
baz.
Dup fiecare trecere prin date, se observ c toate elementele de deasupra ultimei care a fost
interschimbat, precum i aceasta din urm, se afl pe poziiile lor finale, deci nu mai trebuie examinate
la urmtoarele treceri.
Liniile orizontale din figura 1 arat desfurarea operaiei de sortare din acest punct de vedere.
Se observ c n urma trecerii 3, cinci elemente au ajuns n poziia corect. La ultima trecere prin date
nu se mai efectueaz nici un interschimb.

878

907

907

907

907

907

907

907

237

878

878

878

878

878

878

878

348

237

553

553

553

553

553

553

553

348

237

478

478

478

478

478

478

553

348

237

407

407

407

407

372

478

478

348

237

372

472

472

407

372

407

407

348

237

348

348

907

407

372

372

372

348

237

237

77

128

128

128

128

128

128

128

128

77

77

77

77

77

77

77

Figura 1. Modul de desfurare a sortrii cu bule.

Metoda este numit sortare cu bule pentru c elementele mari se ridic la suprafa pn n
poziia lor corect, ca nite bule n ap. Sortarea cu bule mai este cunoscut i sub denumirea selectare
prin interschimbare sau propagare.

Algoritmul n C++ este urmtorul:


void Metoda_bulelor(int (&v)[20], int n)
{int ok,i,aux;
do{
ok=1;
for(i=1;i<=n-1;i++)
if(v[i]>v[i+1])
{ok=0;
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
}
}
while(ok!=1);
}

COMPLEXITATEA ALGORITMULUI
n cazul cel mai favorabil, atunci cnd elementele vectorului sunt aranjate n ordinea cresctoare
a valorilor se parcurge vectorul o singur dat i se execut n-1 comparaii.
n cazul cel mai defavorabil, atunci cnd elementele vectorului sunt aranjate n ordinea
descresctoare a valorilor se execut

n n 1
2

operaii de baz, iar elementele vectorului se parcurg de n

ori, deci algoritmul este de ordinul O(n2).

PERFECIONRI ALE SORTRII PRIN METODA BULELOR


Deoarece la fiecare trecere prin ir cel puin un element ajunge pe poziia sa final, se va forma
la sfritul irului, un subir cresctor. Aadar, nu mai este necesar parcurgerea acestuia. Ne vom
folosi de o variabil p care ne va indica poziia inferioar a subirului cresctor creat.

Algoritmul mbuntit n pseudocod este urmtorul:


Subalgoritm Metoda_bulelor_imbuntit(v,n)
pn
repet
okadevarat
pentru i=l,p-l
execut
dac v[i]>v[i+l]atunci
ok fals
aux v[i]
v[i] v[i+1]
v[i+l] aux
xi
sfrit dac
sfrit pentru
px
pn cnd ok
sfrit subalgoritm

87
8
23
7
34
8
55
3
47
8
37
2
40
7
90
7
77
12
8

90
7
87
8
23
7
34
8
55
3
47
8
37
2
40
7
12
8
77

90
7
87
8
55
3
23
7
34
8
47
8
40
7
37
2
12
8
77

90
7
87
8
55
3
47
8
23
7
34
8
40
7
37
2
12
8
77

90
7
87
8
55
3
47
8
40
7
23
7
34
8
37
2
12
8
77

90
7
87
8
55
3
47
8
40
7
37
2
23
7
34
8
12
8
77

Trecerea

Trecerea

Trecerea

Trecerea

Trecerea

Trecerea

Exemplu
Vom considera acelai vector v cu 10 elemente: 128, 77, 907, 407, 372, 478, 553, 348, 237,
878. Figura 2 prezentat mai jos arat aciunea metodei bulelor mbuntit asupra celor 10 elemente
ale vectorului v1, v2 ,...,v10. Linia neagr orizontal reprezint poziia superioar a unei treceri prin
elementele vectorului. Elementele aflate deasupra acestei linii nu vor mai fi parcurse deoarece acestea
sunt pe poziiile lor finale.

90
7
87
8
55
3
47
8
40
7
47
2
34
8
23
7
12
8
77

90
7
87
8
55
3
47
8
40
7
47
2
34
8
23
7
12
8
77

Figura 2. Modul de desfurare a sortrii cu bule mbuntite


Algoritmul n C++ este urmtorul:
void metoda_bulelor_imbunatatit(int (&v)[20],int n)
{int i,ok,aux,p,x;
p=n;
do{
ok=1;
for(i=1;i<=p-1;i++)
if(v[i]>v[i+1])
{ok=0;
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
x=i;}
p=x;}
while(ok==0);
}

Se observ c la fiecare parcurgere cel puin un element a ajuns pe locul su definitiv n irul
ordonat, 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. Dar este posibil ca la o parcurgere s ajung mai multe elemente n locul lor definitiv.
Rezult c vom ine minte indicele ultimului element care a intervenit n interschimbare i verificrile
le vom efectua doar pn la acest element. Similar, se poate restrnge i indicele primului element care
a intervenit n interschimbri. Se va limita regiunea analizat cu cel puin o poziie att la dreapta ct i
la stnga la fiecare parcurgere a irului.
Aceast variant este cunoscut sub numele de sortarea shaker (shaker sort).
Subalgoritm Bule_shaker (n, K)
st 1
dr n
repeta
t 0
pentru i=st, dr-1 execut
dac v[i] > v[i+l]
atunci
interschimb (v[i],v[i+1])
t i
sfrit dac
sfrit pentru
dac t0 atunci
drt
t0
pentru i=dr, st+1,-1 execut
dac v[i] < v[i-1] atunci
interschimb(v[i],v[i-1])
t i
sfrit dac
sfrit pentru
st < t
sfrit dac
pn cnd t=0 or s=d
sfrit subalgoritm

Trecerea 5

Trecerea 4

Trecerea 3

Trecerea 2

Trecerea 1

Exemplu
Vom considera acelai date ca n exemplele anterioare, i anume vectorul v cu cele 10 elemente:
128, 77, 907, 407, 372, 478, 553, 348, 237, 878. Figura 3 prezentat mai jos arat aciunea metodei
bulelor shaker asupra celor 10 elemente ale vectorului v1, v2 ,...,v10.
Se observ c vectorul este parcurs de la stnga spre dreapta reinndu-se poziia ultimei
interschimbri ntr-o variabil care va reprezenta poziia superioar, pn unde se va face urmtoarea
parcurgere. Apoi, se va face o parcurgere de la dreapta spre reinndu-se ntr-o variabil poziia ultimei
interschimbri care reprezint poziia inferioar, din care va porni urmtoarea parcurgere. Elementele
aflate deasupra poziiei superioare sau sub poziia inferioar nu vor mai fi parcurse la urmtoarea
trecere deoarece acestea sunt pe poziiile lor finale.
Deci, vectorul se parcurge n ambele sensuri, ducnd spre capetele cele mai mari, respectiv cele
mai mici, elemente. K. E. Inverson a fcut urmtoarea observaie interesant: dac j este un indice
astfel nct vj i vj+1 nu sunt interschimbate n dou treceri consecutive, n direcii opuse, atunci vj i vj+1
se gsesc n poziiile lor finale i nu este necesar s intre n nici una din comparaiile care urmeaz.

878

907

907

907

907

907

907

237

878

878

878

878

878

878

348

237

348

553

553

553

553

553

348

553

348

478

478

478

478

553

478

478

407

407

407

372

478

372

407

372

372

372

407

372

407

3722

348

237

237

907

407

237

237

237

348

348

77

128

128

128

128

128

128

128

77

77

77

77

77

77

Figura 3. Modul de desfurare a sortrii shaker

Algoritmul n C++ pentru sortarea shaker este urmtorul:


void metoda_shaker(int (&v)[20],int n)
{int i,s,d,t,aux;
s=1;
d=n;
do
{ t=0;
for(i=s;i<=d-1;i++)
if(v[i]>v[i+1])
{aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
t=i;}
if(t!=0)
{d=t;
t=0;
for(i=d;i>=s+1;i--)
{if(v[i]<v[i-1])
{aux=v[i];
v[i]=v[i-1];
v[i-1]=aux;
t=i;}}
s=t;}
}
while(t!=0&&s!=d);
}

Analiza sortrii prin metoda bulelor a condus la concluzia c nu este o metod foarte bun.
Comparnd aceast metod cu inseria direct se ajunge la concluzia c timpul necesar sortrii cu
metoda bulelor este dublu, iar programul este mult mai complicat.
S-a ncercat mbuntirea acestuia. Una din metodele gsite a fost ''sortarea shaker n care
trecerile alternate merg n direcii opuse. Numrul mediu de comparaii fiind uor redus. i cu aceast
mbuntire algoritmul nu se mbuntete n aa fel nct s devin mai eficient dect inseria direct.

S-ar putea să vă placă și