Title: QuickSort
1QuickSort
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
2Algoritmo QuickSort
- E un algoritmo di ordinamento sul posto
- La sua complessità è
- O(n2) nel caso peggiore
- O(n log n) nel caso medio
- Nonostante le cattive prestazioni nel caso
peggiore, QuickSort è il miglior algoritmo di
ordinamento in media
3Struttura di QuickSort
- È un algoritmo ricorsivo basato sul Divide et
Impera - Divide si partiziona il vettore Asd
(spostando elementi) in due sottovettori Asq-1
e Aq1d, separati da un elemento pivot Aq
ogni elemento di Asq-1 è ? Aq ogni elemento
di Aq1d è gt Aq
Impera si ordinano ricorsivamente i due
sottovettori Asq e Aq1d con QuickSort
Combina si concatenano banalmente i sottovettori
(sono già reciprocamente ordinati!)
4Pseudocodice di QuickSort
Indice mediano
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q1,d)
q è lindice che divide il vettore A in due in
modo che gli elementi con indice ? q siano
minori o uguali a quelli con indice gt q
5Pseudocodice di QuickSort
Ordinamento dei due sottoarray
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
Poiché il primo sottovettore ha elementi tutti
minori o uguali a quelli del secondo
sottovettore, basta ordinare separatamente i due
sottovettori per risolvere lintero problema
6Pseudocodice di QuickSort
passo Divide
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
Partiziona è la chiave dellalgoritmo !
7Partiziona
- Si partiziona il vettore Asd in due
sottovettori Asq-1 e Aq1d tali che ogni
elemento di Asq-1 sia ? Aq e ogni elemento
di Aq1d sia gt Aq - - si sceglie un elemento del vettore, detto pivot
(perno), che farà da spartiacque - - si spostano gli elementi maggiori del pivot
verso destra e gli elementi minori verso sinistra
Lindice mediano q dipende dallelemento pivotè
il numero di elementi minori o uguali al pivot
8Partiziona
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
Chiaro? Mah Discutiamolo in termini di
invarianti di ciclo!
9Partiziona invariante di ciclo
- Partiziona mantiene questo invariante di ciclo
- Ad x lelemento pivot x è in posizione
terminale - il vettore A contiene
- un sottovettore Asi i cui elementi sono tutti
? x - un sottovettore Ai1j-1 i cui elementi sono
tutti gt x
Gli stati ammissibili sono quelli in cui vale
linvariante La distanza dallo stato finale è
misurata da j Linvariante si impone con i s-1
e j s (sottovettori vuoti)
10Partiziona
Stabilire linvariante
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
- Lelemento pivot è in fondo al vettore - I
due sottovettori sono vuoti
11Partiziona
Misurare i progressi
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
La misura di distanza è il numero di elementi
esterni ai due sottovettori cala ad ogni passo
12Partiziona
Mantenere linvariante
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
Ogni passo aggiunge un nuovo elemento in fondoSe
esso è destinato al primo sottovettore, va
scambiato
13Partiziona
Condizioni di uscita
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
Al termine, lelemento pivot deve trovarsi fra i
due sottovettori
14Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 22
i
j
Asi Ai1j-1
15Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 22
i
j
Asi 20 Ai1j-1
16Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 22
i
j
Asi 20 14 Ai1j-1
17Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 22
i
j
Asi 20 14 Ai1j-1 28
18Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 22
i
j
Asi 20 14 Ai1j-1 28 34
19Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 34 28 45 12 30 21 25 16 22
i
j
Asi 20 14 15 Ai1j-1 34 28
20Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 34 28 45 12 30 21 25 16 22
i
j
Asi 20 14 15 Ai1j-1 34 28 45
21Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 28 45 34 30 21 25 16 22
i
j
Asi 20 14 15 12 Ai1j-1 28 45 34
22Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 28 45 34 30 21 25 16 22
i
j
Asi 20 14 15 12 Ai1j-1 28 45 34 30
23Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 21 45 34 30 28 25 16 22
i
j
Asi 20 14 15 12 21 Ai1j-1 45 34 30
28
24Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 21 45 34 30 28 25 16 22
i
j
Asi 20 14 15 12 21 Ai1j-1 45 34 30
28 25
25Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 21 16 34 30 28 25 45 22
i
j
Asi 20 14 15 12 21 16 Ai1j-1 34 30
28 25 45
26Esempio partiziona(A,1,12)
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 21 16 22 30 28 25 45 34
i
j
Asi 20 14 15 12 21 16 Ai1j-1 30 28
25 45 34
27Partiziona un caso limite
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 1
i
j
Se un solo elemento è ? pivot, ...
28Partiziona un caso limite
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 1
i
j
Se un solo elemento è ? pivot, il THEN non
viene mai eseguito
29Partiziona un caso limite
x
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
1 2 3 4 5 6 7
8 9 10 11 12
1 14 28 34 15 45 12 30 21 25 16 20
i
j
Se un solo elemento è ? pivot, la dimensione del
sottovettore sinistro è 1, quella del
sottovettore destro è n-1
30Partiziona analisi di complessità
Partiziona(A,s,d) x Ad i s - 1 j
s WHILE j lt d DO IF Aj ? x THEN
ii1 scambia Ai con Aj j j1
scambia Ai1 con Ad RETURN i1
31QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
20 14 28 34 15 45 12 30 21 25 16 22
s
d
32QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 21 16 22 30 28 25 45 34
s
d
q
33QuickSort un esempio
1 2 3 4 5 6
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
20 14 15 12 21 16
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 21 16 22 30 28 25 45 34
s
d
q
34QuickSort un esempio
1 2 3 4 5 6
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
20 14 15 12 21 16
1 2 3 4 5 6 7
8 9 10 11 12
20 14 15 12 21 16 22 30 28 25 45 34
s
d
35QuickSort un esempio
1 2 3 4 5 6
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
20 14 15 12 21 16
1 2 3 4 5 6 7
8 9 10 11 12
14 15 12 16 20 21 22 30 28 25 45 34
s
d
q
36QuickSort un esempio
1 2 3
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
14 15 12
1 2 3 4 5 6 7
8 9 10 11 12
14 15 12 16 20 21 22 30 28 25 45 34
s
d
q
37QuickSort un esempio
1 2 3
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
14 15 12
1 2 3 4 5 6 7
8 9 10 11 12
14 15 12 16 20 21 22 30 28 25 45 34
s
d
38QuickSort un esempio
1 2 3
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
12 14 15
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
39QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
40QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
41QuickSort un esempio
2 3
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
14 15
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
42QuickSort un esempio
2 3
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
14 15
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
43QuickSort un esempio
2 3
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
14 15
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
44QuickSort un esempio
2
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
14
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
45QuickSort un esempio
2
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
14
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
46QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
47QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
48QuickSort un esempio
5 6
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
20 21
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
49QuickSort un esempio
5 6
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
20 21
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
50QuickSort un esempio
5 6
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
20 21
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
51QuickSort un esempio
5
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
20
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
52QuickSort un esempio
5
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q)
Quick-Sort(A,q 1,d)
20
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
53QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
54QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
55QuickSort un esempio
8 9 10 11 12
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
30 28 25 45 34
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
q
56QuickSort un esempio
8 9 10 11 12
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
30 28 25 45 34
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 45 34
s
d
57QuickSort un esempio
8 9 10 11 12
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
30 28 25 45 34
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 34 45
s
d
q
58QuickSort un esempio
8 9 10 11 12
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
30 28 25 45 34
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 34 45
s
d
q
59QuickSort un esempio
8 9 10
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
30 28 25
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 30 28 25 34 45
s
d
60QuickSort un esempio
8 9 10
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
25 28 30
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
q
61QuickSort un esempio
8 9 10
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
25 28 30
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
q
62QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
63QuickSort un esempio
9 10
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
28 30
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
q
64QuickSort un esempio
9 10
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
28 30
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
65QuickSort un esempio
9 10
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
28 30
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
q
66QuickSort un esempio
9
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
28
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
q
67QuickSort un esempio
9
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
28
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
68QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
q
69QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
70QuickSort un esempio
8 9 10 11 12
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
25 28 30 45 34
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
q
71QuickSort un esempio
12
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
45
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34 45
s
d
72QuickSort un esempio
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
Il vettore A ora è ordinato!
1 2 3 4 5 6 7
8 9 10 11 12
12 14 15 16 20 21 22 25 28 30 34
45
73QuickSort analisi di complessità
- Il tempo di esecuzione di QuickSort dipende dal
bilanciamento fra i sottovettori costruiti da
Partiziona - Il caso migliore si verifica quando i
sottovettori sono perfettamente bilanciati,
entrambi di dimensione n/2 - Il caso peggiore si verifica quando un
sottovettore è sempre di dimensione 1 (laltro è
quindi di dimensione n - 1)
74QuickSort caso migliore
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
Quando si verifica il caso migliore?
- Se i sottovettori sono di uguale dimensione
- T(n) 2T(n/2) ?(n)
- per il caso 2 del teorema principale
- T(n) ?(n log n)
75QuickSort caso peggiore
Quick-Sort(A,s,d) IF s lt d THEN q
Partiziona(A,s,d) Quick-Sort(A,s,q-1)
Quick-Sort(A,q 1,d)
Quando si verifica il caso peggiore?
Il sottovettore sinistro ha dimensione 1, quello
destro dimensione n - 1 T(n) T(1) T(n - 1)
?(n) Poiché T(1) 1 otteniamo T(n) T(n -
1) ?(n)
76QuickSort caso peggiore
s
d
1 2 3 4 5 6
7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10
11 12
Pivot 12
s
d
q
1 2 3 4 5 6
7 8 9 10 11 12
Pivot 11
1 2 3 4 5 6 7 8 9 10
11 12
q
s
d
1 2 3 4 5 6
7 8 9 10 11 12
Pivot 10
1 2 3 4 5 6 7 8 9 10
11 12
q
77QuickSort caso peggiore
Lequazione di ricorrenza può essere risolta
facilmente col metodo iterativo T(n) T(n - 1)
?(n)
?(n2)
78QuickSort caso medio?
La complessità di QuickSort nel caso medio è
molto vicina a quella del caso migliore Per
averne unintuitizione, supponiamo che ad ogni
passo Partiziona dia due sottovettori molto
sbilanciati, ma con un rapporto fisso n1
99/100 n n2 n/100 Allora T(n) T(99n/100)
T(n/100) ?(n) ?(n log n)
(basta applicare il metodo iterativo)
79QuickSort caso medio?
La stessa cosa vale per qualsiasi rapporto fisso
fra le dimensioni dei sottovettori Se n1 (1-e)
n e n2 e n, allora T(n) ?(n log n) Ma non si
può garantire un comportamento così
regolare! Occorre invece unipotesi sulla
distribuzione di probabilità delle diverse
istanze, ad esempio che ogni permutazione sia
equiprobabile Per ogni istanza, la partizione
sarà buona in alcuni livelli, cattiva in altri
80QuickSort caso medio?
Facciamo unaltra ipotesi intuitiva Partiziona
genera una suddivisione cattiva e una buona,
alternate
?(n)
n
n
?(1)
?(n-1)
1
n-1
?((n-1)/2)
?((n-1)/2)
(n-1)/2
(n-1)/2
T(n) ?(n) ?(1) ?(n-1) 2T((n-1)/2)
81QuickSort caso medio?
Facciamo unaltra ipotesi intuitiva Partiziona
genera una suddivisione cattiva e una buona,
alternate
?(n) ?(n-1)
n
n
?((n-1)/2)
?((n-1)/2)
?(1)
(n-1)/2
(n-1)/2
1
E la stessa complessità di una partizione
bilanciata!
T(n) ?(n) ?(1) ?(n-1) 2T((n-1)/2)
Ma non si può garantire un comportamento così
regolare!
82QuickSort caso medio?
Per ottenere un comportamento del tutto casuale,
si sceglie un elemento pivot casuale anziché
lultimo del vettore A
RandomPartiziona(A,s,d) p random(s,d) scambi
a Ap e Ad Partiziona(A,s,d)
Questo rende improbabile che la partizione sia
sempre sbilanciata, anche per le istanze quasi
ordinate
83QuickSort randomizzata analisi
- Consideriamo tutto lalbero delle chiamate di
QuickSort - Ogni chiamata comporta
- alcune operazioni O(1)
- una chiamata a Partiziona, che a sua volta
comporta - altre operazioni O(1)
- un ciclo di confronti fra gli elementi del
sottovettore e il pivot - Ogni chiamata ha un pivot diverso avvengono al
più n chiamate - La complessità è O(n) la complessità dei cicli
di confronti
84QuickSort randomizzata analisi
Quanti confronti fra Aj e x avvengono? Sia ai
li-esimo numero in ordine crescente e pij la
probabilità complessiva che durante lalgoritmo
si confrontino ai e aj Inizialmente, ai e aj
fanno parte del vettore corrente. Se in qualsiasi
momento viene scelto come pivot un elemento
intermedio, ai e aj finiscono in sottovettori
diversi e non verranno mai confrontati Se viene
scelto come pivot uno dei due, ai e aj vengono
confrontati esattamente una volta
85QuickSort randomizzata analisi
Quindi ogni confronto è diverso, perché cambia
uno dei due elementi Il numero di confronti
totale è in media Siltj pij pij è la probabilità
che in un vettore contenente sia ai sia aj si
scelga come pivot o ai o aj, ma non un elemento
intermedio
pij 2 / (j-i1)
Siltj pij Sn-1i1 Snji1 2 / (j-i1)
86QuickSort randomizzata analisi
Siltj pij Sn-1i1 Snji1 2 / (j-i1)
Posto k j-i
Siltj pij Sn-1i1 Sn-ik1 2 / (k1) lt Sn-1i1
Snk1 2 / k lt lt Sn-1i1 log n lt n log n
Siltj pij O(n log n)