• Non ci sono risultati.

Algoritmi e Strutture Dati

N/A
N/A
Protected

Academic year: 2021

Condividi "Algoritmi e Strutture Dati"

Copied!
93
0
0

Testo completo

(1)

Algoritmi e Strutture Dati

QuickSort

(2)

QuickSort

Algoritmo di ordinamento “sul posto” che ha tempo di esecuzione che teoricamente è:

O(n2) nel caso peggiore

O(n log n) nel caso medio

Nonostante le cattive prestazioni nel caso peggiore, rimane il miglior algoritmo di ordinamento in media

(3)

QuickSort

È basato sulla metodologia Divide et Impera:

Dividi: L’array A[p…r] viene “partizionato”

(tramite spostamenti di elementi) in due sotto- array non vuoti A[p…q] e A[q+1…r] in cui:

ä ogni elemento di A[p…q] è minore o uguale ad ogni elemento di A[q+1…r]

Conquista: i due sottoarray A[p…q] e A[q+1…r]

vengono ordinati ricorsivamente con QuickSort

Combina: i sottoarray vengono ordinati anche reciprocamente, quindi non è necessaria alcuna combinazione. A[p…r] è già ordinato.

(4)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

(5)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

Indice mediano

q è l’indice che divide l’array in due sottoarray dove

á tutti gli elementi a sinistra di q (compreso l’elemento in posizione q) sono minori o uguali tutti gli elementi a destra di q

(6)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

Ordinamento dei due sottoarray

Poiché il sottoarray di sinistra contiene elementi tutti minori o uguali a tutti quelli del sottoarray di destra, ordinare i due sottoarray separatamente fornisce la soluzione del problema

(7)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

passo Dividi

Partition è la chiave di tutto l’algoritmo !

IMPORTANTE: q deve essere strettamente minore di r:

q < r

(8)

Algoritmo Partiziona

L’array A[p…r] viene “suddiviso” in due sotto- array “non vuoti” A[p…q] e A[q+1…r] in cui ogni elemento di A[p…q] è minore o uguale ad ogni elemento di A[q+1…r]:

Êl’algoritmo sceglie un valore dell’array che fungerà da elemento “spartiacque” tra i due sotto-array, detto valore pivot.

Ësposta i valori maggiori del pivot verso l’estremità destra dell’array e i valori minori verso quella sinistra.

q dipenderà dal valore pivot scelto: sarà l’estremo della partizione a partire da sinistra nella quale, alla fine, si troveranno solo elemento minori o uguali al pivot.

(9)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

(10)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Elemento Pivot

Gli elementi minori o uguali al Ý Pivot verranno spostati tutti

verso sinistra

Ý Gli elementi maggiori o uguali al Pivot verranno spostati tutti verso destra

(11)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Il ciclo continua finoché i incrocia j

(12)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Cerca il primo elemento da destra che sia minore

o uguale al Pivot x

(13)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Cerca il primo elemento da sinistra che sia maggiore

o uguale al Pivot x

(14)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Se l’array non è stato scandito completamente i <j (i due non

indici si incrociano) allora :

A[i] ≤ x

A[j] ≥ x

gli elementi vengono scambiati

(15)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Se l’array è stato scandito completamente i j (i due indici si incrociano) allora

termina il ciclo

(16)

Algoritmo Partiziona

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Alla fine j è ritornato come indice mediano

dell’array

(17)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

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

x

(18)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

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

x

(19)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

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

x

(20)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 28 34 15 45 12 30 21 25 20 22

i j

x

(21)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 28 34 15 45 12 30 21 25 20 22

i j

x

(22)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 28 34 15 45 12 30 21 25 20 22

i j

x

(23)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 12 34 15 45 28 30 21 25 20 22

i j

x

(24)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 12 34 15 45 28 30 21 25 20 22

i j

x

(25)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 12 34 15 45 28 30 21 25 20 22 i j

x

(26)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 12 15 34 45 28 30 21 25 20 22 i j

x

(27)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 12 15 34 45 28 30 21 25 20 22 i

j

x

(28)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: partiziona(A,1,12)

1 2 3 4 5 6 7 8 9 10 11 12

16 14 12 15y 34 45 28 30 21 25 20 22

i j

x

(29)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

1 14 28 34 15 45 12 30 21 25 16 22

i j

x

Se esiste un solo elemento minore o uguale al pivot, ...

(30)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

1 14 28 34 15 45 12 30 21 25 16 22 i j

x

Se esiste un solo elemento minore o uguale al pivot, ...

(31)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

1y 14 28 34 15 45 12 30 21 25 16 22

i j

x

Se esiste un solo elemento minore o uguale al pivot, l’array è partizionato in due

porzioni: quella sinistra ha dimensione 1 e quella destra

ha dimensione n-1

(32)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

2 1 28 34 15 45 12 30 21 25 16 22

i j

x

Se esistono solo due elementi minori o uguali al

pivot, ...

(33)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

2 1 28 34 15 45 12 30 21 25 16 22 i j

x

Se esistono solo due elementi minori o uguali al

pivot, ...

(34)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

1 2 28 34 15 45 12 30 21 25 16 22 i j

x

Se esistono solo due elementi minori o uguali al

pivot, ...

(35)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

1 2 28 34 15 45 12 30 21 25 16 22 j i

x

Se esistono solo due elementi minori o uguali al

pivot, ...

(36)

int Partiziona(A,p,r) x = A[p]

i = p - 1 j = r + 1

fine = false REPEAT

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x IF i < j

THEN “scambia A[i] con A[j]”

ELSE fine = true UNTIL fine DO

return j

Algoritmo Partiziona: casi estremi

1 2 3 4 5 6 7 8 9 10 11 12

1 y 2 28 34 15 45 12 30 21 25 16 22

j i

x

Se esistono solo due

elemento minori o uguali al pivot, l’array è partizionato in

due porzioni: quella sinistra ha dimensione 1 e quella destra ha dimensione n-1

(37)

Algoritmo Partiziona: casi estremi

Partiziona è quindi tale che:

SE il numero di elementi dell’array minori o uguali all’elemento A[p], scelto come pivot, è pari a 1 (cioè A[p] è l’elemento minimo) o a 2,

ALLORA le dimensioni delle partizioni restituite sono 1 per la partizione di sinistra e n - 1 per quella di destra.

(38)

Algoritmo QuickSort

1 2 3 4 5 6 7 8 9 10 11 12

20 14 28 34 15 45 12 30 21 25 16 22

p r

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

(39)

Algoritmo QuickSort

1 2 3 4 5 6 7 8 9 10 11 12

20 14 28 34 15 45 12 30 21 25 16 22

p r

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

(40)

Algoritmo QuickSort

1 2 3 4 5 6 7 8 9 10 11 12

p r

16 14 12 15y 34 45 28 30 21 25 20 22

q

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

(41)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p r

16 14 12 15y 34 45 28 30 21 25 20 22

q

5 6 7 8 9 10 11 12

34 45 28 30 21 25 20 22

(42)

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

16 14 12 15y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22

(43)

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

16 14 12 15y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22

(44)

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

15 14 12y 16y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22

q

(45)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

15 14 12y 16y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22

q

16

(46)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

15 14 12y 16y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

(47)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14y 15y 16y34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

q

(48)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14y 15y 16y34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

q

(49)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14y 15y 16y34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

3

15

(50)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14y 15y 16y34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

3

15

(51)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 1415 y 16y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

q

(52)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15y 16y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

(53)

4

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15y 16y 34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22 16

(54)

5 6 7 8 9 10 11 12

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y34 45 28 30 21 25 20 22

r

34 45 28 30 21 25 20 22

(55)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y34 45 28 30 21 25 20 22

r q

(56)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y34 45 28 30 21 25 20 22

r

(57)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y22 20 28 30 21 25 y 45 34

r q

(58)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y22 20 28 30 21 25 y 45 34

r

11 12

45 34

q

(59)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y21 20y 28 30 22 25y 45 34

r

11 12

45 34

q

(60)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y21 20y 28 30 22 25y 45 34

r

11 12

45 34

q

(61)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y21 20y 28 30 22 25y 45 34

r

11 12

45 34

7 8 9 10

28 30 22 25

(62)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

11 12

45 34

7 8 9 10

28 30 22 25

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y20y 21y28 30 22 25 y 45 34

r q

(63)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

11 12

45 34

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y20 21y 28 30 22 25y 45 34

r q

(64)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

11 12

45 34

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y20 21y 28 30 22 25y 45 34

r

(65)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

11 12

45 34

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y20 21y 25 22y 30 28 y 45 34

r q

(66)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

11 12

45 34

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y20 21y 22 25y 28 30 y 45 34

r q

(67)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y20 21y 22 25y 28 30 y 45 34

r q

(68)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p 12 14 15 16y20 21y 22 25y 28 30 y 45 34

r

(69)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p 12 14 15 16y20 21y 22 25y 28 30 y 34y 45

r q

(70)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

p

12 14 15 16y20 21y 22 25y 28 30 y 34 45

r q

(71)

Algoritmo QuickSort

Quick-Sort(A,p,r) IF p < r

THEN q = Partiziona(A,p,r) Quick-Sort(A,p,q)

Quick-Sort(A,q + 1,r)

1 2 3 4 5 6 7 8 9 10 11 12

12 14 15 16 20 21 22 25 28 30 34 45

L’array A ora è ordinato!

(72)

Algoritmo Partiziona: analisi

Gli indici i e j che scandiscono la sequenza non ne eccedono mai i limiti. Cioè vale sempre che i≤ r e j≥ p

(73)

Algoritmo Partiziona: analisi

Gli indici i e j che scandiscono la sequenza non ne eccedono mai i limiti. Cioè vale sempre che i≤ r e j≥ p

2 Casi. Partiziona effettua:

• nessuno spostamento

• almeno uno spostamento

1 2 3 4 5 6 7 8 9 10 11 12

1 14 12 15 34 45 28 30 21 25 20 45 j

p x r

i

(74)

Algoritmo Partiziona: analisi

Gli indici i e j che scandiscono la sequenza non ne eccedono mai i limiti. Cioè vale sempre che i≤ r e j≥ p

1 2 3 4 5 6 7 8 9 10 11 12

1 14 12 15 34 45 28 30 21 25 20 45 j

p x r

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x

i

(75)

Algoritmo Partiziona: analisi

Gli indici i e j che scandiscono la sequenza non ne eccedono mai i limiti. Cioè vale sempre che i≤ r e j≥ p

1 2 3 4 5 6 7 8 9 10 11 12

1 14 12 15 34 45 28 30 21 25 20 45

p x r

nessuno spostamento A[ j ]≤ x per j ≥ p

A[i ] ≥ x per i≤ p

REPEAT j = j - 1 UNTIL A[j] ≤ x REPEAT i = i + 1

UNTIL A[i] ≥ x

i j

Riferimenti

Documenti correlati

- se valgono convessità delle preferenze e ottimo interno, la tangenza è necessaria e sufficiente per ottimo, - se vale solo convessità potremmo avere un ottimo di frontiera

[r]

precisamente, allorché P , Q ed R sono vere e Z è falsa, la prima premessa risulta vera (per verità del conseguente o, che è esattamente la stessa cosa, per falsità

[r]

In fact, knowing what the shape of the canonical form will be (see the textbook, or simply the text of the present exercise), from the fact that for x + y − z + 2t = 0 (which defines

Trovare il valore ottimale della costante C j per ciascuna variabile

[r]

[r]