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. Partiţionare. Se rearanjează elementele în aşa fel încât, toate
elementele care sunt mai mari decât pivotul merg în partea dreaptă
a tabloului. Valorile egale cu pivotul pot sta în orice parte a
tabloului. În plus, tabloul poate fi împărţit în părţi care nu au
aceeaşi dimensiune (nu sunt egale).
3. Se sortează amândouă părţile.se aplică recursiv algoritmul de
sortare rapidă în partea stângă şi în partea dreaptă.
Algoritmul de partiţie în detaliu.

Există 2 indici i şi j, şi la începutul algoritmului de


partiţionare i indică primul element al tabloului iar j indică
ultimul element din tablou. La pasul următor algoritmul mută i
înainte, pâna când un element cu o valoare mai mare sau
egală cu pivotul este găsită. Indicele j este mutat înapoi, pâna
când un element cu valoare mai mică sau egală cu pivotul
este găsită. Dacă i<=j atunci i merge pe poziţia i+1 iar j merge
pe poziţia j-1. Algoritmul se opreşte, când i > j

Exemplu dorim să sortăm şirul {1, 13, 7, 28, 10, 16, 3, 10, 2}
folosind sortarea rapidă.
Nesortat

1 13 7 28 10 16 3 10 2
Valoarea pivot =10; i=1; j=9.

1 13 7 28 10 16 3 10 2
13>=10>=2 interschimbăm 13 cu 2 creşte i, scade j

1 13 7 28 10 16 3 10 2
28>=10>=10 interschimbam 28 cu 10; creşte i, scade j

1 2 7 28 10 16 3 10 13
10>=10>=3 interschimbăm 10 cu 3; creşte i scade j

1 2 7 10 10 16 3 28 13
i>j se opreşte partiţionarea

1 2 7 10 3 16 10 28 13
se aplică din nou algoritmul pentru
(1, 2, 7, 10, 3 ) şi 1(6, 10, 28, 13)

1 2 7 10 3 16 10 28 13
Pivot=7; i=1, j=5

1 2 7 10 3 16 10 28 13
1<7 creşte i

1 2 7 10 3 16 10 28 13
2<7 creşte i

1 2 7 10 3 16 10 28 13
7>3 interschimbam 7 cu 3
creşte i scade j

1 2 7 10 3 16 10 28 13
10>7 interschimbăm 10 cu 7
creşte i scade j; i>j - stop

1 2 3 10 7 16 10 28 13
Se aplică algoritmul pentru
partea dreaptă Pivot=10
Parte sortată

1 2 3 7 10 16 10 28 13
16>=10>=13
interschimbăm 16 cu 13
creşte i scade j

1 2 3 7 10 16 10 28 13
10>=10 se interschimbă
10 cu 10 creşte i scade j
i>j se continuă
partiţionarea
1 2 3 7 10 13 10 28 16
Se aplica algoritmul pentru
(13 10 ) şi (28 16)

1 2 3 7 10 13 10 28 16
13>=10 se
interschimbă 13 cu 10

1 2 3 7 10 13 10 28 16
28>=16 se
interschimbă 28 cu 16

1 2 3 7 10 10 13 28 16
Vector sortat

1 2 3 7 10 10 13 16 28
Algoritm descris în pseudocod:
quickSort(V,st,dr);
pivot←v[(st+dr) div 2)];
i=st; j=dr;
cât timp i<=j execută
cât timp v[i] <pivot execută
i←i+1;
dacă i<=j atunci
aux←v[i];
v[i]←v[j];
v[j]←aux;
i←i+1;
j←j-1;

dacă st<j atunci


quikSort(v,st,j);
dacă i<dr atunci
quikSort(v,i,dr);

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