Sunteți pe pagina 1din 22

Sortarea rapid (QuickSort)

Descriere
Metoda Divide et Impera este utilizat n sortarea rapid.
Ideea algoritmului:
1. Se alege o valoare pivot. Se ia valoarea elementului din mijloc
ca valoare pivot, dar poate fi oricare alt valoare, care este n
intervalul valorilor sortate, chiar dac nu este prezent n tablou.
2. Partiionare. Se rearanjeaz elementele n aa fel nct, toate
elementele care sunt mai mari dect pivotul merg n partea dreapt
a tabloului. Valorile egale cu pivotul pot sta n orice parte a
tabloului. n plus, tabloul poate fi mprit n pri care nu au
aceeai dimensiune (nu sunt egale).
3. Se sorteaz amndou prile.se aplic recursiv algoritmul de
sortare rapid n partea stng i n partea dreapt.

Algoritmul de partiie n detaliu.


Exist 2 indici i i j, i la nceputul algoritmului de
partiionare i indic primul element al tabloului iar j indic
ultimul element din tablou. La pasul urmtor algoritmul mut i
nainte, pna cnd un element cu o valoare mai mare sau
egal cu pivotul este gsit. Indicele j este mutat napoi, pna
cnd un element cu valoare mai mic sau egal cu pivotul
este gsit. Dac i<=j atunci i merge pe poziia i+1 iar j merge
pe poziia j-1. Algoritmul se oprete, cnd i > j
Exemplu dorim s sortm irul {1, 13, 7, 28, 10, 16, 3, 10, 2}
folosind sortarea rapid.

Nesortat

13 7

28 10 16 3

10 2

Valoarea pivot =10; i=1; j=9.

13 7

28 10 16 3

10 2

13>=10>=2 interschimbm 13 cu 2 crete i, scade j

13 7

28 10 16 3

10 2

28>=10>=10 interschimbam 28 cu 10; crete i, scade j

28 10 16 3

10 13

10>=10>=3 interschimbm 10 cu 3; crete i scade j

10 10 16 3

28 13

i>j se oprete partiionarea

10 3

16 10 28 13

se aplic din nou algoritmul pentru


(1, 2, 7, 10, 3 ) i 1(6, 10, 28, 13)

10 3

16 10 28 13

Pivot=7; i=1, j=5

10 3

16 10 28 13

1<7 crete i

10 3

16 10 28 13

2<7 crete i

10 3

16 10 28 13

7>3 interschimbam 7 cu 3
crete i scade j

10 3

16 10 28 13

10>7 interschimbm 10 cu 7
crete i scade j; i>j - stop

10 7

16 10 28 13

Se aplic algoritmul pentru


partea dreapt Pivot=10

Parte sortat

10

16 10 28 13

16>=10>=13
interschimbm 16 cu 13
crete i scade j

10

16 10 28 13

10>=10 se interschimb
10 cu 10 crete i scade j
i>j se continu
partiionarea

10

13 10 28 16

Se aplica algoritmul pentru


(13 10 ) i (28 16)

10

13 10 28 16

13>=10 se
interschimb 13 cu 10

10

13 10

28 16

28>=16 se
interschimb 28 cu 16

10

10 13

28 16

Vector sortat
1

10 10 13 16 28

Algoritm descris n pseudocod:


quickSort(V,st,dr);
pivotv[(st+dr) div 2)];
ct timp i<=j execut
ct timp v[i] <pivot execut
ii+1;
dac i<=j atunci
auxv[i];
v[i]v[j];
v[j]aux;
ii+1;
jj-1;
dac st<j atunci
quikSort(v,st,j);
dac i<dr atunci
quikSort(v,i,dr);