Algoritmi e Strutture Dati

Slides:



Advertisements
Presentazioni simili
Algoritmi di ordinamento
Advertisements

Il problema della ricerca Algoritmi e Strutture Dati.
Problema dellordinamento Input: Sequenza di n numeri Output: Permutazione π = tale che: a 1 a 2 …… a n Subroutine in molti problemi E possibile effettuare.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
                      Insertion-Sort
Algoritmi notevoli In linguaggio C.
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Alberi binari di ricerca
Code con priorità Ordinamento
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Iterazione enumerativa (for)
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Usa la tecnica del.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati Introduzione. Gli argomenti di oggi Analisi della bontà degli algoritmi Modello Computazionale Tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
Algoritmi e Strutture Dati
Heap binari e HeapSort.
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
Elementi di Informatica di base
Radix-Sort(A,d) // A[i] = cd...c2c1
Algoritmi e Strutture Dati
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
Soluzione 6: Algoritmo Quicksort
TECNICA DIVIDE ET IMPERA
Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna.
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 07/04/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
GLI ALGORITMI DI ORDINAMENTO
Quick sort void quick_sort (int a[],int l, int r) { int i, j,v, t; if (r>l) { v=a[r];//L’elemento “pivot” è quello più a dx i=l-1; j=r; // i scorre da.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Divide et Impera Parte 11 - Risoluzione di problemi per divisione in sottoproblemi “bilanciati” Corso A: Prof. Stefano Berardi
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
6/11/01Ordinamento 1 Un esempio di algoritmi: ordinamento.
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli
MergeSort Usa la tecnica del divide et impera:
Transcript della presentazione:

Algoritmi e Strutture Dati QuickSort

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

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.

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)

Algoritmo QuickSort Indice mediano 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) 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

Algoritmo QuickSort Ordinamento dei due sottoarray 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) 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

Algoritmo QuickSort passo Dividi 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) Partition è la chiave di tutto l’algoritmo !

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 scelto come pivot: sarà l’indice della posizione in cui si troverà alla fine l’elemento più grande minore o uguale al pivot.

Algoritmo Partiziona Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j

Algoritmo Partiziona Elemento Pivot Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j Gli elementi minori o uguali al Pivot verranno spostati tutti verso sinistra Gli elementi maggiori o uguali al Pivot verranno spostati tutti verso destra

La condizione true è sempre vera! Il ciclo WHILE continua fino ... Algoritmo Partiziona Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j La condizione true è sempre vera! Il ciclo WHILE continua fino ...

Algoritmo Partiziona La condizione true è sempre vera! Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j La condizione true è sempre vera! Il ciclo WHILE continua fino all’esecuzione del return

Cerca il primo elemento da destra che sia minore o uguale al Pivot x Algoritmo Partiziona Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j Cerca il primo elemento da destra che sia minore o uguale al Pivot x

Algoritmo Partiziona Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j Cerca il primo elemento da sinistra che sia maggiore o uguale al Pivot x

gli elementi vengono scambiati Algoritmo Partiziona Se l’array non è stato scandito completamente (da destra e da sinisra): A[i]  x A[j]  x gli elementi vengono scambiati Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j

Algoritmo Partiziona Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j Se l’array è stato scandito completamente (da destra e da sinisra) i  j : j è l’indice mediano q dell’array

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 1 2 3 4 5 6 7 8 9 10 11 12 16 14 12 15 34 45 28 30 21 25 20 22 j i

Algoritmo Partiziona: partiziona(A,1,12) x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 1 2 3 4 5 6 7 8 9 10 11 12 16 14 12 15  34 45 28 30 21 25 20 22 j i

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 Se esiste un solo elemento minore o uguale al pivot, ...

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 Se esiste un solo elemento minore o uguale al pivot, ...

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 Se esistono 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

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 Se esistono solo due elementi minori o uguali al pivot, ...

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 Se esistono solo due elementi minori o uguali al pivot, ...

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 Se esistono solo due elementi minori o uguali al pivot, ...

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 Se esistono solo due elementi minori o uguali al pivot, ...

Algoritmo Partiziona: casi estremi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j 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 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

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.

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 20 14 28 34 15 45 12 30 21 25 16 22 p r

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 20 14 28 34 15 45 12 30 21 25 16 22 p r

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 16 14 12 15  34 45 28 30 21 25 20 22 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 1 2 3 4 5 6 7 8 9 10 11 12 16 14 12 15  34 45 28 30 21 25 20 22 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 1 2 3 4 5 6 7 8 9 10 11 12 16 14 12 15  34 45 28 30 21 25 20 22 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 1 2 3 4 5 6 7 8 9 10 11 12 16 14 12 15  34 45 28 30 21 25 20 22 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 1 2 3 4 5 6 7 8 9 10 11 12 15 14 12  16  34 45 28 30 21 25 20 22 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 1 2 3 4 5 6 7 8 9 10 11 12 15 14 12  16  34 45 28 30 21 25 20 22 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 1 2 3 4 5 6 7 8 9 10 11 12 15 14 12  16  34 45 28 30 21 25 20 22 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 1 2 3 4 5 6 7 8 9 10 11 12 12 14  15  16  34 45 28 30 21 25 20 22 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 1 2 3 4 5 6 7 8 9 10 11 12 12 14  15  16  34 45 28 30 21 25 20 22 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 3 15 1 2 3 4 5 6 7 8 9 10 11 12 12 14  15  16  34 45 28 30 21 25 20 22 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 3 15 1 2 3 4 5 6 7 8 9 10 11 12 12 14  15  16  34 45 28 30 21 25 20 22 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15  16  34 45 28 30 21 25 20 22 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15  16  34 45 28 30 21 25 20 22 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 4 16 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15  16  34 45 28 30 21 25 20 22 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 5 6 7 8 9 10 11 12 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) 34 45 28 30 21 25 20 22 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  34 45 28 30 21 25 20 22 p r

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  34 45 28 30 21 25 20 22 p q r

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  34 45 28 30 21 25 20 22 p r

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  22 20 28 30 21 25  45 34 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  22 20 28 30 21 25  45 34 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  21 20  28 30 22 25  45 34 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  21 20  28 30 22 25  45 34 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 7 8 9 10 28 30 22 25 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  21 20  28 30 22 25  45 34 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 7 8 9 10 28 30 22 25 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  20  21  28 30 22 25  45 34 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  20 21  28 30 22 25  45 34 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  20 21  28 30 22 25  45 34 p r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  20 21  25 22  30 28  45 34 p q r

Algoritmo QuickSort Quick-Sort(A,p,r) IF p < r 11 12 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) 45 34 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16  20 21  22 25  28 30  45 34 p q r

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  45 34 p q r

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  45 34 p r

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 p q r

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 p q r

L’array A ora è ordinato! 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) L’array 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

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p 2 Casi. Partiziona effettua: nessuno spostamento almeno uno spostamento x p r 1 2 3 4 5 6 7 8 9 10 11 12 1 14 12 15 34 45 28 30 21 25 20 45 i j

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 1 14 12 15 34 45 28 30 21 25 20 45 i j … REPEAT j = j - 1 UNTIL A[j]  x REPEAT i = i + 1 UNTIL A[i]  x

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 1 14 12 15 34 45 28 30 21 25 20 45 i j … REPEAT j = j - 1 UNTIL A[j]  x REPEAT i = i + 1 UNTIL A[i]  x nessuno spostamento A[ j ]  x per j  p A[i ]  x per i  p

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 21 14 12 15 34 45 28 30 1 25 20 45 i j … REPEAT j = j - 1 UNTIL A[j]  x REPEAT i = i + 1 UNTIL A[i]  x

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 21 14 12 15 34 45 28 30 1 25 20 45 i j … REPEAT j = j - 1 UNTIL A[j]  x REPEAT i = i + 1 UNTIL A[i]  x

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 20 14 12 15 34 45 28 30 1 25 21 45 i j … IF i < j THEN “scambia A[i] con A[j]” ELSE return j dopo il primo spostamento, esiste un k tale che A[k ]  x per p  k  j esiste un z tale che A[z ]  x per i  z  r

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 20 14 12 15 34 45 28 30 1 25 21 45 i j … REPEAT j = j - 1 UNTIL A[j]  x REPEAT i = i + 1 UNTIL A[i]  x In generale, dopo ogni scambio: - un elemento minore o uguale ad x viene spostato tra p e j -1 - un elemento maggiore o uguale ad x viene spostato tra i +1 e r

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 20 14 12 15 34 45 28 30 1 25 21 45 i j … REPEAT j = j - 1 UNTIL A[j]  x REPEAT i = i + 1 UNTIL A[i]  x In generale, dopo ogni scambio: - tra p e j -1 ci sarà sicuramente un elemento minore o uguale ad x - tra i +1 e r ci sarà sicuramente un elemento maggiore o uguale ad x

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 20 14 12 15 1 45 28 30 34 25 21 45 i j … IF i < j THEN “scambia A[i] con A[j]” ELSE return j In generale, dopo ogni scambio: - tra p e j -1 ci sarà sicuramente un elemento minore o uguale ad x - tra i +1 e r ci sarà sicuramente un elemento maggiore o uguale ad x

Algoritmo Partiziona: analisi Gli indici i e j che scandiscono il sottoarray non ne eccedono mai i limiti. Cioè vale sempre che i  r e j  p x p r 1 2 3 4 5 6 7 8 9 10 11 12 20 14 12 15 1 45 28 30 34 25 21 45 j i … REPEAT j = j - 1 UNTIL A[j]  x REPEAT i = i + 1 UNTIL A[i]  x In generale, dopo ogni scambio: - tra p e j -1 ci sarà sicuramente un elemento minore o uguale ad x - tra i +1 e r ci sarà sicuramente un elemento maggiore o uguale ad x

Algoritmo Partiziona: analisi Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j

Algoritmo Partiziona: analisi x Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j r 1 2 3 4 5 6 7 8 9 10 11 12 21 14 12 15 34 45 28 30 1 25 20 45 i j i e j non possono eccedere i limiti dell’array, i e j sono sempre rispettiva- mente crescente e decrescente l’algoritmo termina quando i  j quindi il costo del while sarà proporzionale ad n, cioè (n)

Algoritmo Partiziona: analisi Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j

Algoritmo Partiziona: analisi Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 WHILE true DO 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 return j

Analisi di QuickSort: intuizioni Il tempo di esecuzione di QuickSort dipende dalla bilanciamento delle partizioni effet-tuate dall’algoritmo partiziona Il caso migliore si verifica quando le partizioni sono perfettamente bilanciate, entrambe di dimensione n/2 Il caso peggiore si verifica quando una partizione è sempre di dimensione 1 (la seconda è quindi di dimensione n - 1)

Analisi di QuickSort: caso migliore 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) Le partizioni sono di uguale dimensione: T(n) = 2T(n/2) + (n) e per il caso 2 del metodo principale: T(n) = (n log n)

Analisi di QuickSort: caso migliore 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) Quando si verifica il caso migliore, ad esempio? Le partizioni sono di uguale dimensione: T(n) = 2T(n/2) + (n) e per il caso 2 del metodo principale: T(n) = (n log n)

Analisi di QuickSort: caso peggiore 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 = 1 p q r 2 3 4 5 6 7 8 9 10 11 12 2 | 3 4 5 6 7 8 9 10 11 12 Pivot = 2 q p r 3 4 5 6 7 8 9 10 11 12 3 | 4 5 6 7 8 9 10 11 12 Pivot = 3 q

Analisi di QuickSort: caso peggiore 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) La partizione sinistra ha dimensione 1 mentre quella sinistra ha dimensione n - 1: T(n) = T(1) + T(n - 1) + (n) poiché T(1) = 1 otteniamo T(n) = T(n - 1) + (n)

Analisi di QuickSort: caso peggiore L’equazione di ricorrenza può essere risolta facilmente col metodo iterativo T(n) = T(n - 1) + (n) = = (n2)

Analisi di QuickSort: caso peggiore 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) Quando si verifica il caso peggiore, ad esempio? La partizione sinistra ha dimensione 1 mentre quella sinistra ha dimensione n - 1: T(n) = T(n - 1) + (n) = = (n2)