You are on page 1of 133

Quick Sort

2012
abs 2012 1 / 127
Algoritmul
abs 2012 2 / 127
QuickSort ca Divide and Conquer
procedure QS(Left, Right)
if (Right - Left + 1) = 1 then
// (Right - Left + 1) reprezinta dimensiunea vectorului
return; // nu facem nimic
else
// Urmatorul apel corespunde pasului Divide.
Partition(Left,Right,q); // Returneaza pivotul n q.
// Pivotul este pus la locul sau nal.
QS(Left, q-1); // 1 apel recursiv
QS(q+1, Right); // 2 apel recursiv
// Pentru pasul Combine nu trebuie sa facem nimic.
endif
endproc
Procedura Partition
Pentru a sorta vectorul A[1..n] apelul principal va QS(1,n);
abs 2012 3 / 127
Scurta animat ie a algoritmului
abs 2012 4 / 127
quicksort
Despre partit ii la Quick Sort
abs 2012 5 / 127
Partit ia Hoare
Procedura Partition
Procedura de partit ionare Hoare pe subvectorul A[Left..Right] este urmatoarea:
procedure Partition(Left, Right)
// iLeft=indicele curent pentru parcurgerea (2a)
// iRight=indicele curent pentru parcurgerea (2b)
iLeft:=Left; iRight=Right; // init ializarea indicilor curent i pentru parcurgeri
x:=A[(Left+Right)div 2]; // algerea pivotului n pozit ie mediana
repeat // partit ia
while A[iLeft] < x do // (2a)
iLeft:= iLeft+1;
endwhile
while A[iRight] > x do // (2b)
iRight:= iRight - 1;
endwhile
if iLeft iRight then // (3)
Interschimb a(A[iLeft], A[iRight]);
iLeft:= iLeft+1;
iRight:= iRight-1;
endif
until (iLeft > iRight)
endproc
abs 2012 6 / 127
Partit ia Hoare
Procedura Partition
Procedura de partit ionare Hoare pe subvectorul A[Left..Right] este urmatoarea:
procedure Partition(Left, Right)
// iLeft=indicele curent pentru parcurgerea (2a)
// iRight=indicele curent pentru parcurgerea (2b)
iLeft:=Left; iRight=Right; // init ializarea indicilor curent i pentru parcurgeri
x:=A[(Left+Right)div 2]; // algerea pivotului n pozit ie mediana
repeat // partit ia
while A[iLeft] < x do // (2a)
iLeft:= iLeft+1;
endwhile
while A[iRight] > x do // (2b)
iRight:= iRight - 1;
endwhile
if iLeft iRight then // (3)
Interschimb a(A[iLeft], A[iRight]);
iLeft:= iLeft+1;
iRight:= iRight-1;
endif
until (iLeft > iRight)
endproc
abs 2012 6 / 127
. . . . . . . . .
valori < x valori > x
1 i-1 i
j j+1 n
(2a) (2b)
(3)
Figure : Procedura de partit ionare.
abs 2012 7 / 127
Exemplu:
13 19 9 5 12 8 7 4 11 2 6 21
iLeft:=1
x:=A[6]
iRight:=12
Figure : vectorul A init ial
x:=A[(Left+Right)div 2];
iLeft:=1; iRight=12;
abs 2012 8 / 127
Exemplu:
19 13 9 5 12 8 7 4 11 2 6 21
iLeft:=1
x:=A[6]
iRight:=12
Figure : (2a)
A[1] x, deci nu putem avansa cu iLeft.
abs 2012 9 / 127
Exemplu:
13 19 9 5 12 8 7 4 11 2 6 21
iLeft:=1
x:=A[6]
iRight:=11
Figure : (2b)
A[12] > x, deci iRight := iRight-1.
abs 2012 10 / 127
Exemplu:
13 19 9 5 12 8 7 4 11 2 21 6
iLeft:=1
x:=A[6]
iRight:=11
Figure : (2b)
A[11] x, deci iRight nu mai avanseaza.
abs 2012 11 / 127
Exemplu:
19 13 9 5 12 8 7 4 11 2 21 6
iLeft:=1
x:=A[6]
iRight:=11
Figure : (3)
Trebuie sa interschimbam A[1] cu A[11].
abs 2012 12 / 127
Exemplu:
19 6 9 5 12 8 7 4 11 2 21 13
iLeft:=1
x:=A[6]
iRight:=11
Figure : (3)
Vectorul obt inut dupa interschimbare.
abs 2012 13 / 127
Exemplu:
6 19 9 5 12 8 7 4 11 2 13 21
iLeft:=2
x:=A[6]
iRight:=11
Figure : (3)
iLeft:= iLeft+1;
abs 2012 14 / 127
Exemplu:
6 19 9 5 12 8 7 4 11 2 13 21
iLeft:=2
x:=A[6]
iRight:=10
Figure : (3)
iRight:= iRight-1;
abs 2012 15 / 127
Exemplu:
6 19 9 5 12 8 7 4 11 2 13 21
iLeft:=2
x:=A[6]
iRight:=10
Figure : Dupa prima iterat ie a ciclului repeat
Avem 2 = iLeft iRight = 10, deci continuam procedura de partit ie.
abs 2012 16 / 127
Exemplu:
6 9 19 5 12 8 7 4 11 2 13 21
iLeft:=2
x:=A[6]
iRight:=10
Figure : (2a)
A[2] x, deci nu putem avansa cu iLeft.
abs 2012 17 / 127
Exemplu:
6 19 9 5 12 8 7 4 11 13 2 21
iLeft:=2
x:=A[6]
iRight:=10
Figure : (2b)
A[10] x, deci nu putem avansa cu iRight.
abs 2012 18 / 127
Exemplu:
6 9 19 5 12 8 7 4 11 13 2 21
iLeft:=2
x:=A[6]
iRight:=10
Figure : (3)
Trebuie sa interschimbam A[2] cu A[10].
abs 2012 19 / 127
Exemplu:
6 9 2 5 12 8 7 4 11 13 19 21
iLeft:=2
x:=A[6]
iRight:=10
Figure : (3)
Vectorul obt inut dupa interschimbare.
abs 2012 20 / 127
Exemplu:
6 2 9 5 12 8 7 4 11 19 13 21
iLeft:=3
x:=A[6]
iRight:=10
Figure : (3)
iLeft:= iLeft+1;
abs 2012 21 / 127
Exemplu:
6 2 9 5 12 8 7 4 11 19 13 21
iLeft:=3
x:=A[6]
iRight:=9
Figure : (3)
iRight:= iRight-1;
abs 2012 22 / 127
Exemplu:
6 2 9 5 12 8 7 4 11 19 13 21
iLeft:=3
x:=A[6]
iRight:=9
Figure : (Vectorul dupa a doua iterat ie a ciclului repeat )
Avem 3 = iLeft iRight = 9, deci continuam procedura de partit ie.
abs 2012 23 / 127
Exemplu:
6 2 5 9 12 8 7 4 11 19 13 21
iLeft:=3
x:=A[6]
iRight:=9
Figure : (2a)
A[3] x, deci nu putem avansa cu iLeft.
abs 2012 24 / 127
Exemplu:
6 2 9 5 12 8 7 4 19 11 13 21
iLeft:=3
x:=A[6]
iRight:=8
Figure : (2b)
A[9] > x, deci iRight := iRight - 1.
abs 2012 25 / 127
Exemplu:
6 2 9 5 12 8 7 11 4 19 13 21
iLeft:=3
x:=A[6]
iRight:=8
Figure : (2b)
A[8] x, deci nu putem avansa cu iRight.
abs 2012 26 / 127
Exemplu:
6 2 5 9 12 8 7 11 4 19 13 21
iLeft:=3
x:=A[6]
iRight:=8
Figure : (2b)
Trebuie sa interschimbam A[3] cu A[8].
abs 2012 27 / 127
Exemplu:
6 2 5 4 12 8 7 11 9 19 13 21
iLeft:=3
x:=A[6]
iRight:=8
Figure : (3)
Vectorul obt inut dupa interschimbare.
abs 2012 28 / 127
Exemplu:
6 2 4 5 12 8 7 9 11 19 13 21
iLeft:=4
x:=A[6]
iRight:=8
Figure : (3)
iLeft:= iLeft+1;
abs 2012 29 / 127
Exemplu:
6 2 4 5 12 8 7 9 11 19 13 21
iLeft:=4
x:=A[6]
iRight:=7
Figure : (3)
iRight:= iRight-1;
abs 2012 30 / 127
Exemplu:
6 2 4 5 12 8 7 9 11 19 13 21
iLeft:=4
x:=A[6]
iRight:=7
Figure : (Vectorul dupa a treia iterat ie a ciclului repeat )
Avem 4 = iLeft iRight = 7, deci continuam procedura de partit ie.
abs 2012 31 / 127
Exemplu:
6 2 4 12 5 8 7 9 11 19 13 21
iLeft:=5
x:=A[6]
iRight:=7
Figure : (2a)
A[4] < x, deci iLeft := iLeft + 1.
abs 2012 32 / 127
Exemplu:
6 2 4 5 8 12 7 9 11 19 13 21
iLeft:=5
x:=A[6]
iRight:=7
Figure : (2a)
A[5] x, deci nu putem avansa cu iLeft.
abs 2012 33 / 127
Exemplu:
6 2 4 5 12 8 9 7 11 19 13 21
iLeft:=5
x:=A[6]
iRight:=7
Figure : (2b)
A[7] x, deci nu putem avansa cu iRight.
abs 2012 34 / 127
Exemplu:
6 2 4 5 8 12 9 7 11 19 13 21
iLeft:=5
x:=A[6]
iRight:=7
Figure : (3)
Trebuie sa interschimbam A[5] cu A[7].
abs 2012 35 / 127
Exemplu:
6 2 4 5 8 7 9 12 11 19 13 21
iLeft:=5
x:=A[6]
iRight:=7
Figure : (3)
Vectorul obt inut dupa interschimbare.
abs 2012 36 / 127
Exemplu:
6 2 4 5 7 8 12 9 11 19 13 21
iLeft:=6
x:=A[6]
iRight:=7
Figure : (3)
iLeft:= iLeft+1;
abs 2012 37 / 127
Exemplu:
6 2 4 5 7 8 12 9 11 19 13 21
iLeft:=6
x:=A[6]
iRight:=6
Figure : (3)
iRight:= iRight-1;
abs 2012 38 / 127
Exemplu:
6 2 4 5 7 8 12 9 11 19 13 21
iLeft:=6
x:=A[6]
iRight:=6
Figure : Vectorul dupa a patra iterat ie a ciclului repeat
Avem 6 = iLeft iRight = 6, deci continuam procedura de partit ie.
abs 2012 39 / 127
Exemplu:
6 2 4 5 7 12 8 9 11 19 13 21
iLeft:=6
x:=A[6]
iRight:=6
Figure : Vectorul dupa a patra iterat ie a ciclului repeat
A[6] x, deci nu putem avansa cu iLeft.
abs 2012 40 / 127
Exemplu:
6 2 4 5 7 12 8 9 11 19 13 21
iLeft:=6
x:=A[6]
iRight:=6
Figure : Vectorul dupa a patra iterat ie a ciclului repeat
A[6] x, deci nu putem avansa cu iRight.
abs 2012 41 / 127
Exemplu:
6 2 4 5 7 12 8 9 11 19 13 21
iLeft:=6
x:=A[6]
iRight:=6
Figure : Vectorul dupa a patra iterat ie a ciclului repeat
Trebuie sa interschimbam A[6] cu A[6].
abs 2012 42 / 127
Exemplu:
6 2 4 5 7 12 8 9 11 19 13 21
iLeft:=6
x:=A[6]
iRight:=6
Figure : (3)
Vectorul obt inut dupa interschimbare.
abs 2012 43 / 127
Exemplu:
6 2 4 5 7 12 8 9 11 19 13 21
iLeft:=7
x:=A[6]
iRight:=6
Figure : (3)
iLeft:= iLeft+1;
abs 2012 44 / 127
Exemplu:
6 2 4 5 7 12 8 9 11 19 13 21
iLeft:=7
x:=A[6]
iRight:=5
Figure : (3)
iRight:= iRight-1;
abs 2012 45 / 127
Exemplu:
6 2 4 5 7 12 8 9 11 19 13 21
iLeft:=7
x:=A[6]
iRight:=5
Figure : Vectorul dupa a patra iterat ie a ciclului repeat
Avem 7 = iLeft > iRight = 5, deci ncheiem procedura de partit ie.
abs 2012 46 / 127
Exemplu:
6 2 4 5 7 8 12 9 11 19 13 21
Figure : Final
Am obt inut partit ia: A[1..5], A[7..12].
abs 2012 47 / 127
Ce se ntampla daca vectorul cont ine chei multiple?
Un alt exemplu..
abs 2012 48 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=1
x:=A[3]
iRight:=5
Figure : vectorul A init ial
x:=A[(Left+Right)div 2];
iLeft:=1; iRight=5;
abs 2012 49 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=1
x:=A[3]
iRight:=5
Figure : (2a)
A[1] x, deci nu putem avansa cu iLeft.
abs 2012 50 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=1
x:=A[3]
iRight:=5
Figure : (2b)
A[5] x, deci nu putem avansa cu iRight.
abs 2012 51 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=1
x:=A[3]
iRight:=5
Figure : (2b)
Trebuie sa interschimbam A[1] si A[5].
abs 2012 52 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=1
x:=A[3]
iRight:=5
Figure : (3)
Vectorul obt inut dupa interschimbare.
abs 2012 53 / 127
Exemplu pentru chei multiple:
5 5 5 5 5

iLeft:=2
x:=A[3]
iRight:=5
Figure : (3)
iLeft:= iLeft+1;
abs 2012 54 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=2
x:=A[3]

iRight:=4
Figure : (3)
iRight:= iRight-1;
abs 2012 55 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=2
x:=A[3]
iRight:=4
Figure : (3)
Avem 2 = iLeft iRight = 4, deci continuam procedura de partit ie.
abs 2012 56 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=2
x:=A[3]
iRight:=4
Figure : (3)
A[2] x, deci nu putem avansa cu iLeft.
abs 2012 57 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=2
x:=A[3]
iRight:=4
Figure : Dupa prima iterat ie a ciclului repeat
A[4] x, deci nu putem avansa cu iRight.
abs 2012 58 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=2
x:=A[3]
iRight:=4
Figure : (2a)
Trebuie sa interschimbam A[2] si A[4].
abs 2012 59 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=2
x:=A[3]
iRight:=4
Figure : (2b)
Vectorul obt inut dupa interschimbare.
abs 2012 60 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=3

x:=A[3]
iRight:=4
Figure : (3)
iLeft:= iLeft+1;
abs 2012 61 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=3
x:=A[3]
iRight:=3

Figure : (3)
iRight := iRight-1;
abs 2012 62 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=3
x:=A[3]
iRight:=3
Figure : (3)
Avem 3 = iLeft iRight = 3, deci continuam procedura de partit ie.
abs 2012 63 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=3
x:=A[3]
iRight:=3
Figure : (3)
A[3 x, deci nu putem avansa cu iLeft.
abs 2012 64 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=3
x:=A[3]
iRight:=3
Figure : (Vectorul dupa a doua iterat ie a ciclului repeat )
A[3] x, deci nu putem avansa cu iRight.
abs 2012 65 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=3
x:=A[3]
iRight:=3
Figure : (2a)
Trebuie sa interschimbam A[3] si A[3].
abs 2012 66 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=3
x:=A[3]
iRight:=3
Figure : (2b)
Vectorul obt inut dupa interschimbare.
abs 2012 67 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=4

x:=A[3]
iRight:=3
Figure : (2b)
iLeft := iLeft+1;
abs 2012 68 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=4
x:=A[3]
iRight:=2

Figure : (2b)
iRight := iRight-1;
abs 2012 69 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
iLeft:=4
x:=A[3]
iRight:=2
Figure : (3)
Avem 4 = iLeft > iRight = 2, deci ncheiem procedura de partit ie.
abs 2012 70 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
5 5 5 5 5
Figure : Final
Observam ca desi valorile erau egale, acestea si-au schimbat pozit ia.
abs 2012 71 / 127
Exemplu pentru chei multiple:
5 5 5 5 5
Figure : Final
Am obt inut partit ia: A[1..2], A[4..5].
Observam ca avem iLeft < iRight si partit ia data:
A[Left..iRight] si A[iLeft..Right].
abs 2012 72 / 127
Partit ia cu pivot ntr-o extremitate
Pana acum am ales ca pivot valoarea mediana din vectorul pe care facem
partit ia. Ce se ntampla daca alegem o valoare situata la una dintre
extremitat i?
Sa presupunem ca, pentru partit ionarea vectorului A[Left..Right]
alegem x = A[Left].
Atunci, pasul (2a) din algoritmul de partit ionare (parcurgerea de la
stanga la dreapta a vectorului pana la primul indice i pentru care
A[i ] x) nu mai are sens, caci acest indice este chiar Left.
Executam (2b), adica parcurgem de la dreapta la stanga vectorul
pana la primul indice j pentru care A[j ] x.
Pasul (3) devine:
if Left < j then
interschimba (A[Left], A[j])
abs 2012 73 / 127
Partit ia cu pivot ntr-o extremitate
Pana acum am ales ca pivot valoarea mediana din vectorul pe care facem
partit ia. Ce se ntampla daca alegem o valoare situata la una dintre
extremitat i?
Sa presupunem ca, pentru partit ionarea vectorului A[Left..Right]
alegem x = A[Left].
Atunci, pasul (2a) din algoritmul de partit ionare (parcurgerea de la
stanga la dreapta a vectorului pana la primul indice i pentru care
A[i ] x) nu mai are sens, caci acest indice este chiar Left.
Executam (2b), adica parcurgem de la dreapta la stanga vectorul
pana la primul indice j pentru care A[j ] x.
Pasul (3) devine:
if Left < j then
interschimba (A[Left], A[j])
abs 2012 73 / 127
Partit ia cu pivot ntr-o extremitate
Pana acum am ales ca pivot valoarea mediana din vectorul pe care facem
partit ia. Ce se ntampla daca alegem o valoare situata la una dintre
extremitat i?
Sa presupunem ca, pentru partit ionarea vectorului A[Left..Right]
alegem x = A[Left].
Atunci, pasul (2a) din algoritmul de partit ionare (parcurgerea de la
stanga la dreapta a vectorului pana la primul indice i pentru care
A[i ] x) nu mai are sens, caci acest indice este chiar Left.
Executam (2b), adica parcurgem de la dreapta la stanga vectorul
pana la primul indice j pentru care A[j ] x.
Pasul (3) devine:
if Left < j then
interschimba (A[Left], A[j])
abs 2012 73 / 127
Partit ia cu pivot ntr-o extremitate
Pana acum am ales ca pivot valoarea mediana din vectorul pe care facem
partit ia. Ce se ntampla daca alegem o valoare situata la una dintre
extremitat i?
Sa presupunem ca, pentru partit ionarea vectorului A[Left..Right]
alegem x = A[Left].
Atunci, pasul (2a) din algoritmul de partit ionare (parcurgerea de la
stanga la dreapta a vectorului pana la primul indice i pentru care
A[i ] x) nu mai are sens, caci acest indice este chiar Left.
Executam (2b), adica parcurgem de la dreapta la stanga vectorul
pana la primul indice j pentru care A[j ] x.
Pasul (3) devine:
if Left < j then
interschimba (A[Left], A[j])
abs 2012 73 / 127
Partit ia cu pivot ntr-o extremitate
Pana acum am ales ca pivot valoarea mediana din vectorul pe care facem
partit ia. Ce se ntampla daca alegem o valoare situata la una dintre
extremitat i?
Sa presupunem ca, pentru partit ionarea vectorului A[Left..Right]
alegem x = A[Left].
Atunci, pasul (2a) din algoritmul de partit ionare (parcurgerea de la
stanga la dreapta a vectorului pana la primul indice i pentru care
A[i ] x) nu mai are sens, caci acest indice este chiar Left.
Executam (2b), adica parcurgem de la dreapta la stanga vectorul
pana la primul indice j pentru care A[j ] x.
Pasul (3) devine:
if Left < j then
interschimba (A[Left], A[j])
abs 2012 73 / 127
Observam ca valoarea pivot x = A[Left] a participat la
interschimbare, si se aa acum plasata n extremitatea dreapta a
subvectorului A[Left..j ].
Reluam acum parcurgerea de tip (2a) de la stanga la dreapta.
Parcurgerea de tip (2b) nu mai are sens.
La sfarsit interschimbam. Observam ca valoarea pivot participa din
nou la interschimbare.
Procedeul continua pana cand cele doua parcurgeri se ntalnesc, adica
atata timp cat mai exista componente n vector care nu au fost
comparate cu pivotul.
La sfarsit obt inem valoarea pivot x plasata la locul ei nal n vector.
Fie loc indicele lui A ce va cont ine pe x. Avem atunci:
A[k] x k [1..loc 1]
A[k] x k [loc + 1..n]
Deci subintervalele ce trebuie procesate n continuare sunt
A[1..loc 1] si A[loc + 1..n].
abs 2012 74 / 127
Observam ca valoarea pivot x = A[Left] a participat la
interschimbare, si se aa acum plasata n extremitatea dreapta a
subvectorului A[Left..j ].
Reluam acum parcurgerea de tip (2a) de la stanga la dreapta.
Parcurgerea de tip (2b) nu mai are sens.
La sfarsit interschimbam. Observam ca valoarea pivot participa din
nou la interschimbare.
Procedeul continua pana cand cele doua parcurgeri se ntalnesc, adica
atata timp cat mai exista componente n vector care nu au fost
comparate cu pivotul.
La sfarsit obt inem valoarea pivot x plasata la locul ei nal n vector.
Fie loc indicele lui A ce va cont ine pe x. Avem atunci:
A[k] x k [1..loc 1]
A[k] x k [loc + 1..n]
Deci subintervalele ce trebuie procesate n continuare sunt
A[1..loc 1] si A[loc + 1..n].
abs 2012 74 / 127
Observam ca valoarea pivot x = A[Left] a participat la
interschimbare, si se aa acum plasata n extremitatea dreapta a
subvectorului A[Left..j ].
Reluam acum parcurgerea de tip (2a) de la stanga la dreapta.
Parcurgerea de tip (2b) nu mai are sens.
La sfarsit interschimbam. Observam ca valoarea pivot participa din
nou la interschimbare.
Procedeul continua pana cand cele doua parcurgeri se ntalnesc, adica
atata timp cat mai exista componente n vector care nu au fost
comparate cu pivotul.
La sfarsit obt inem valoarea pivot x plasata la locul ei nal n vector.
Fie loc indicele lui A ce va cont ine pe x. Avem atunci:
A[k] x k [1..loc 1]
A[k] x k [loc + 1..n]
Deci subintervalele ce trebuie procesate n continuare sunt
A[1..loc 1] si A[loc + 1..n].
abs 2012 74 / 127
Observam ca valoarea pivot x = A[Left] a participat la
interschimbare, si se aa acum plasata n extremitatea dreapta a
subvectorului A[Left..j ].
Reluam acum parcurgerea de tip (2a) de la stanga la dreapta.
Parcurgerea de tip (2b) nu mai are sens.
La sfarsit interschimbam. Observam ca valoarea pivot participa din
nou la interschimbare.
Procedeul continua pana cand cele doua parcurgeri se ntalnesc, adica
atata timp cat mai exista componente n vector care nu au fost
comparate cu pivotul.
La sfarsit obt inem valoarea pivot x plasata la locul ei nal n vector.
Fie loc indicele lui A ce va cont ine pe x. Avem atunci:
A[k] x k [1..loc 1]
A[k] x k [loc + 1..n]
Deci subintervalele ce trebuie procesate n continuare sunt
A[1..loc 1] si A[loc + 1..n].
abs 2012 74 / 127
Observam ca valoarea pivot x = A[Left] a participat la
interschimbare, si se aa acum plasata n extremitatea dreapta a
subvectorului A[Left..j ].
Reluam acum parcurgerea de tip (2a) de la stanga la dreapta.
Parcurgerea de tip (2b) nu mai are sens.
La sfarsit interschimbam. Observam ca valoarea pivot participa din
nou la interschimbare.
Procedeul continua pana cand cele doua parcurgeri se ntalnesc, adica
atata timp cat mai exista componente n vector care nu au fost
comparate cu pivotul.
La sfarsit obt inem valoarea pivot x plasata la locul ei nal n vector.
Fie loc indicele lui A ce va cont ine pe x. Avem atunci:
A[k] x k [1..loc 1]
A[k] x k [loc + 1..n]
Deci subintervalele ce trebuie procesate n continuare sunt
A[1..loc 1] si A[loc + 1..n].
abs 2012 74 / 127
Observam ca valoarea pivot x = A[Left] a participat la
interschimbare, si se aa acum plasata n extremitatea dreapta a
subvectorului A[Left..j ].
Reluam acum parcurgerea de tip (2a) de la stanga la dreapta.
Parcurgerea de tip (2b) nu mai are sens.
La sfarsit interschimbam. Observam ca valoarea pivot participa din
nou la interschimbare.
Procedeul continua pana cand cele doua parcurgeri se ntalnesc, adica
atata timp cat mai exista componente n vector care nu au fost
comparate cu pivotul.
La sfarsit obt inem valoarea pivot x plasata la locul ei nal n vector.
Fie loc indicele lui A ce va cont ine pe x. Avem atunci:
A[k] x k [1..loc 1]
A[k] x k [loc + 1..n]
Deci subintervalele ce trebuie procesate n continuare sunt
A[1..loc 1] si A[loc + 1..n].
abs 2012 74 / 127
Observam ca valoarea pivot x = A[Left] a participat la
interschimbare, si se aa acum plasata n extremitatea dreapta a
subvectorului A[Left..j ].
Reluam acum parcurgerea de tip (2a) de la stanga la dreapta.
Parcurgerea de tip (2b) nu mai are sens.
La sfarsit interschimbam. Observam ca valoarea pivot participa din
nou la interschimbare.
Procedeul continua pana cand cele doua parcurgeri se ntalnesc, adica
atata timp cat mai exista componente n vector care nu au fost
comparate cu pivotul.
La sfarsit obt inem valoarea pivot x plasata la locul ei nal n vector.
Fie loc indicele lui A ce va cont ine pe x. Avem atunci:
A[k] x k [1..loc 1]
A[k] x k [loc + 1..n]
Deci subintervalele ce trebuie procesate n continuare sunt
A[1..loc 1] si A[loc + 1..n].
abs 2012 74 / 127
Procedura Partition2
Dam mai jos noua procedura de partit ionare.
La parcurgeri ea va lasa pe loc valorile egale cu pivotul.
Indicele loc t ine minte tot timpul componenta pe care se aa valoarea
pivot.
La sfarsit o transmite procedurii apelante pentru a putea calculate
noile capete ale subvectorilor rezultat i.
abs 2012 75 / 127
procedure Partition2 (Left, Right, loc)
// loc este indicele pe care se va plasa n nal valoarea x = A[Left]
// init ializarea indicilor i si j pentru parcurgerile de la stanga la dreapta, respectiv de la
dreapta la stanga
i:= Left; j:= Right;
loc:= Left // init ializarea indicelui loc
while i < j do
// parcurgerea de la dreapta la stanga, urmata de interschimbare
while (A[loc] A[j]) and (j = loc) do
j:= j-1
endwhile
if A[loc] > A[j] then
Interschimb a(A[loc], A[j])
loc:= j
endif
// parcurgerea de la stanga la dreapta, urmata de interschimbare
while (A[i] A[loc]) and (i = loc) do
i:= i +1
endwhile
if A[i] > A[loc] then
Interschimb a (A[loc], A[i])
loc:= i
endif
endwhile
endproc
abs 2012 76 / 127
Partit ia Lomuto
Avantaje fat a de Partition2
Pivot ntr-o extremitate, dar parcurge restul, facand separarea
valorilor, ntr-un singur sens.
Reducerea numarului de interschimbari: Lomuto face m + 1, fat a de
2m facute de Partition2.
abs 2012 77 / 127
Partit ia Lomuto
Avantaje fat a de Partition2
Pivot ntr-o extremitate, dar parcurge restul, facand separarea
valorilor, ntr-un singur sens.
Reducerea numarului de interschimbari: Lomuto face m + 1, fat a de
2m facute de Partition2.
abs 2012 77 / 127
Partit ia Lomuto
procedure PartitionLomuto(Left, Right, loc)
x:=A[Right]; // algerea pivotului n ntr-o extremitate
// loc este indicele pe care se va plasa n nal valoarea x = A[Right]
loc:=Left-1;
// init ializarea indicelui j pentru parcurgerea de la stanga la dreapta (un
singur sens)
j:= Left;
while j Right do
if A[j] x then
loc:=loc+1;
Interschimba(A[loc],A[j]);
endif
j:=j+1;
endwhile
if loc Right then
loc:=loc-1;
endif
endproc
abs 2012 78 / 127
Exemplu:
13 19 9 5 12 21 7 4 11 2 6 8
loc:=0
j:=1
x:=A[12]
Right:=12
Left:=1
x:=A[Right];
loc:=Left-1; j:= Left
abs 2012 79 / 127
Exemplu:
19 13 9 5 12 21 7 4 11 2 6 8
loc:=0
j:=1
x:=A[12]
Right:=12
Left:=1
A[1] > x.
abs 2012 80 / 127
Exemplu:
19 13 9 5 12 21 7 4 11 2 6 8
loc:=0
j:=2
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 81 / 127
Exemplu:
13 9 19 5 12 21 7 4 11 2 6 8
loc:=0
j:=2
x:=A[12]
Right:=12
Left:=1
A[2] > x.
abs 2012 82 / 127
Exemplu:
13 9 19 5 12 21 7 4 11 2 6 8
loc:=0
j:=3
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 83 / 127
Exemplu:
13 19 5 9 12 21 7 4 11 2 6 8
loc:=0
j:=3
x:=A[12]
Right:=12
Left:=1
A[3] > x.
abs 2012 84 / 127
Exemplu:
13 19 5 9 12 21 7 4 11 2 6 8
loc:=0
j:=4
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 85 / 127
Exemplu:
13 19 9 12 5 21 7 4 11 2 6 8
loc:=0
j:=4
x:=A[12]
Right:=12
Left:=1
A[4] x.
abs 2012 86 / 127
Exemplu:
13 19 9 12 5 21 7 4 11 2 6 8
loc:=1
j:=4
x:=A[12]
Right:=12
Left:=1
Avansam cu loc.
abs 2012 87 / 127
Exemplu:
19 13 9 12 5 21 7 4 11 2 6 8
loc:=1
j:=4
x:=A[12]
Right:=12
Left:=1
Trebuie sa interschimbam A[1] cu A[4].
abs 2012 88 / 127
Exemplu:
19 5 9 12 13 21 7 4 11 2 6 8
loc:=1
j:=4
x:=A[12]
Right:=12
Left:=1
Vectorul dupa interschimbare.
abs 2012 89 / 127
Exemplu:
19 5 9 12 13 21 7 4 11 2 6 8
loc:=1
j:=5
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 90 / 127
Exemplu:
19 5 9 13 21 12 7 4 11 2 6 8
loc:=1
j:=5
x:=A[12]
Right:=12
Left:=1
A[5] > x.
abs 2012 91 / 127
Exemplu:
19 5 9 13 21 12 7 4 11 2 6 8
loc:=1
j:=6
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 92 / 127
Exemplu:
19 5 9 13 12 7 21 4 11 2 6 8
loc:=1
j:=6
x:=A[12]
Right:=12
Left:=1
A[6] > x.
abs 2012 93 / 127
Exemplu:
19 5 9 13 12 7 21 4 11 2 6 8
loc:=1
j:=7
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 94 / 127
Exemplu:
19 5 9 13 12 21 4 7 11 2 6 8
loc:=1
j:=7
x:=A[12]
Right:=12
Left:=1
A[7] x.
abs 2012 95 / 127
Exemplu:
19 5 9 13 12 21 4 7 11 2 6 8
loc:=2
j:=7
x:=A[12]
Right:=12
Left:=1
Avansam cu loc.
abs 2012 96 / 127
Exemplu:
5 9 19 13 12 21 4 7 11 2 6 8
loc:=2
j:=7
x:=A[12]
Right:=12
Left:=1
Trebuie sa interschimbam A[2] cu A[7].
abs 2012 97 / 127
Exemplu:
5 9 7 13 12 21 4 19 11 2 6 8
loc:=2
j:=7
x:=A[12]
Right:=12
Left:=1
Vectorul dupa interschimbare.
abs 2012 98 / 127
Exemplu:
5 9 7 13 12 21 4 19 11 2 6 8
loc:=2
j:=8
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 99 / 127
Exemplu:
5 9 7 13 12 21 19 11 4 2 6 8
loc:=2
j:=8
x:=A[12]
Right:=12
Left:=1
A[8] x.
abs 2012 100 / 127
Exemplu:
5 9 7 13 12 21 19 11 4 2 6 8
loc:=3
j:=8
x:=A[12]
Right:=12
Left:=1
Avansam cu loc.
abs 2012 101 / 127
Exemplu:
5 7 13 9 12 21 19 11 4 2 6 8
loc:=3
j:=8
x:=A[12]
Right:=12
Left:=1
Trebuie sa interschimbam A[3] cu A[8].
abs 2012 102 / 127
Exemplu:
5 7 13 4 12 21 19 11 9 2 6 8
loc:=3
j:=8
x:=A[12]
Right:=12
Left:=1
Vectorul dupa interschimbare.
abs 2012 103 / 127
Exemplu:
5 7 13 4 12 21 19 11 9 2 6 8
loc:=3
j:=9
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 104 / 127
Exemplu:
5 7 13 4 12 21 19 9 2 11 6 8
loc:=3
j:=9
x:=A[12]
Right:=12
Left:=1
A[9] > x.
abs 2012 105 / 127
Exemplu:
5 7 13 4 12 21 19 9 2 11 6 8
loc:=3
j:=10
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 106 / 127
Exemplu:
5 7 13 4 12 21 19 9 11 6 2 8
loc:=3
j:=10
x:=A[12]
Right:=12
Left:=1
A[10] x.
abs 2012 107 / 127
Exemplu:
5 7 13 4 12 21 19 9 11 6 2 8
loc:=4
j:=10
x:=A[12]
Right:=12
Left:=1
Avansam cu loc.
abs 2012 108 / 127
Exemplu:
5 7 4 12 13 21 19 9 11 6 2 8
loc:=4
j:=10
x:=A[12]
Right:=12
Left:=1
Trebuie sa interschimbam A[4] cu A[10].
abs 2012 109 / 127
Exemplu:
5 7 4 12 2 21 19 9 11 6 13 8
loc:=4
j:=10
x:=A[12]
Right:=12
Left:=1
Vectorul dupa interschimbare.
abs 2012 110 / 127
Exemplu:
5 7 4 12 2 21 19 9 11 6 13 8
loc:=4
j:=11
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 111 / 127
Exemplu:
5 7 4 12 2 21 19 9 11 13 8 6
loc:=4
j:=11
x:=A[12]
Right:=12
Left:=1
A[11] x.
abs 2012 112 / 127
Exemplu:
5 7 4 12 2 21 19 9 11 13 8 6
loc:=5
j:=11
x:=A[12]
Right:=12
Left:=1
Avansam cu loc.
abs 2012 113 / 127
Exemplu:
5 7 4 2 21 12 19 9 11 13 8 6
loc:=5
j:=11
x:=A[12]
Right:=12
Left:=1
Trebuie sa interschimbam A[5] cu A[11].
abs 2012 114 / 127
Exemplu:
5 7 4 2 21 6 19 9 11 13 8 12
loc:=5
j:=11
x:=A[12]
Right:=12
Left:=1
Vectorul dupa interschimbare.
abs 2012 115 / 127
Exemplu:
5 7 4 2 21 6 19 9 11 13 8 12
loc:=5
j:=12
x:=A[12]
Right:=12
Left:=1
Avansam cu j.
abs 2012 116 / 127
Exemplu:
5 7 4 2 21 6 19 9 11 13 12 8
loc:=5
j:=12
x:=A[12]
Right:=12
Left:=1
A[8] x.
abs 2012 117 / 127
Exemplu:
5 7 4 2 21 6 19 9 11 13 12 8
loc:=6
j:=12
x:=A[12]
Right:=12
Left:=1
Avansam cu loc.
abs 2012 118 / 127
Exemplu:
5 7 4 2 6 19 21 9 11 13 12 8
loc:=6
j:=12
x:=A[12]
Right:=12
Left:=1
Trebuie sa interschimbam A[6] cu A[12].
abs 2012 119 / 127
Exemplu:
5 7 4 2 6 19 8 9 11 13 12 21
loc:=6
j:=12
x:=A[12]
Right:=12
Left:=1
Vectorul dupa interschimbare. Algoritmul se termina.
abs 2012 120 / 127
Exemplu:
5 7 4 2 6 19 8 9 11 13 12 21
loc:=6
A 6-a valoare din A este pe pozit ia loc = 6.Am obt inut partit ia:
A[1..5], A[7..12].
abs 2012 121 / 127

You might also like