Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:

Slides:



Advertisements
Presentazioni simili
Algoritmi di ordinamento
Advertisements

Gli Algoritmi di ordinamento
INFORMATICA Algoritmi fondamentali
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Unità G3 Algoritmi notevoli. Ordinamento Un insieme di dati {a0, a1, a2, …, an} si dice ordinato in ordine crescente se a0 a1 a2 a3 … an I dati sono generalmente.
Algoritmi notevoli.
Algoritmi notevoli In linguaggio C.
Procedure e funzioni ricorsive
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Il Problema dellordinamento.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Il Problema dellordinamento.
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci
RB-alberi (Red-Black trees)
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 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Heap Sort. L’algoritmo heap sort è il più lento di quelli di ordinamento O(n * log n) ma, a differenza degli altri (fusione e quick sort) non richiede.
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 Usa la tecnica del.
Iterazione enumerativa (for)
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
PROGRAMMI DI RICERCA E ORDINAMENTO
Mergesort1 if (n>1) /* la collezione contiene almeno due elementi. */ {1. Dividi la collezione in due di circa la metà degli elementi. 2. chiamata ricorsiva.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
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:
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: Selection e Insertion Sort 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
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Ordinamento di una lista: bubble-sort
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.
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
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)
Fondamenti di Informatica1 Ripetizioni di segmenti di codice Spesso è necessario ripetere più volte uno stesso segmento dell'algoritmo (e.g. I/O, elaborazioni.
Elementi di Informatica di base
Problema dell’ordinamento di un array: Il metodo Bubble Sort.
Radix-Sort(A,d) // A[i] = cd...c2c1
ALGORITMI a.
Algoritmi di Ordinamento
Algoritmi CHE COS’è UN ALGORITMO di ORDINAMENTO?
A LGORITMI DI ORDINAMENTO Cinzia Reverberi. COS’È UN ALGORITMO? Un algoritmo è un insieme ben ordinato di operazioni non ambigue ed effettivamente calcolabili.
Definizione di un algoritmo
Array (ordinamento) CORDA – Informatica A. Ferrari.
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
La ricorsione.
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
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.
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
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:
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
GLI ALGORITMI DI ORDINAMENTO
L’ALGORITMO Un algoritmo è un procedimento formale che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
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.
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo La ricorsione 15 Approccio ricorsivo, esercizi sulla.
Transcript della presentazione:

Problema dell’Ordinamento

Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio: – Dato il vettore V = {3,1,7,9,12,5,3,4,2,10} di N = 10 numeri interi, lo si ordini in modo tale che sia verificata la proprietà: P = { V[i]  V[i+1]  i=1,.. N-1}

Problema dell’ordinamento Il problema può essere risolto utilizzando diversi algoritmi: –Ordinamento per scambi (Bubble Sort) –Ordinamento per Inserzioni –Ordinamento per distribuzione e fusione (Merge Sort) –Ordinamento con doppio indice (Quick Sort)

Ordinamento per Scambi L’algoritmo Bubble Sort prevede: –il confronto e l’eventuale scambio degli elementi del vettore per coppie; –il confronto va iterato su tutti gli elementi della sottolista da ordinare in modo da portare l’elemento massimo nell’ultima posizione; –dopo aver portato l’elemento massimo della sottolista nell’ultima posizione vengono ripetute ciclicamente le operazioni precedenti in modo da ordinare le restanti sottoliste.

Ordinamento per Scambi Confronto e scambio I iterazione –Situazione iniziale  –I passo  –II passo  –Dopo il passo N  Confronto Sottolista ordinata

Ordinamento per Scambi Iterazione k+1 –Dopo la k-esima iterazione Sottolista ordinata k-1 k

Ordinamento per Scambi Problema dello scambio –Lo scambio può avvenire correttamente solo se si utilizza una variabile di comodo C V[i] V[i+1] Passo 1 Passo 2 Passo 3 Frammento di codice C = V[i+1]; V[i+1] = V[i]; V[i] = C;

Ordinamento per Scambi Ordinamento con l’algoritmo Bubble Sort // Ciclo di ordinamento della sottolista for ( j = 0; j < N; j++ ) { // Scansione interna al sottoarray per collocare nella // ultima posizione l’elemento massimo for ( k = 0; k <= j; k++ ) { if ( lista[k] > lista[j] ) // if (!P) { // Scambia i valori scambio = lista[k]; lista[k] = lista[k+1]; lista[k+1] = scambio; }

Ordinamento per Scambi Ottimizzazione dell’algoritmo –L’algoritmo può essere ottimizzato se si considera che: L’ultimo scambio in un ciclo determina la sottolista ordinata. Infatti, se l’ultimo scambio in una iterazione è avvenuto alla posizione k, vuol dire che la sottolista di elementi da k+1 ad N è ordinata, quindi la successiva iterazione dovrà riguardare gli elementi da 1 a k. –L’algoritmo può terminare anticipatamente qualora in una iterazione non vi sono stati scambi.

Ordinamento per Scambi Complessità –Numero di operazioni di confronto n(n-1)/2 –Complessità O(n 2 )

Ordinamento per Inserzioni L’algoritmo di ordinamento per inserzioni prevede: –si considera l’elemento a[i] –la ricerca del primo elemento più piccolo (a[k]) di quello selezionato all’interno della sottolista da ordinare; –l’inserimento dell’elemento a[k] al posto di a[i] e si scalano di una posizione in avanti tutti gli elementi della sottolista fino a quello immediatamente precedente a[k]; –Si intera il procedimento con l’elemento a[i+1].

Ordinamento per Inserzioni Elementi da scalare di una posizione I iterazione –Situazione iniziale  –I passo  –II passo  –III Passo

// Ciclo di ordinamento della sottolista for ( j = 0; j < N; j++ ) for ( k = j+1; k < N; k++ ) if ( lista[k] < lista[j] ) { // Salvataggio del valore V[k] c = V[k]; // Shift degli elementi di una posizione for(i=k-1; i=>j; i--) V[i+1] = V[i]; // Inserzione nella posizione j del valore precedentemente salvato V[j] = c; }

Ordinamento per Inserzioni Complessità –L’algoritmo richiede n inserzioni. L’inserzione dell’j-mo elemento al posto k richiede k-1 confronti e j-k spostamenti, cioè j-1 operazioni (+ l’inserimento). Il numero di operazioni è quindi n(n-1)/2 –Complessità O(n 2 )

Ordinamento con doppio indice (Quick Sort) L’algoritmo Quick Sort prevede l’utilizzo dell’ –algoritmo di separazione –Utilizzo ricorsivo dell’algoritmo di separazione sulle due sottoliste fino a ordinare tutti gli elementi

Ordinamento con doppio indice (Quick Sort) L’algoritmo Quick Sort prevede l’utilizzo dell’ –algoritmo di separazione: tale algoritmo, tramite lo spostamento fisico di al più 3 elementi per volta, tende a raggiungere una situazione per cui: sia identificato un elemento di sparazione x siano identificate due sottoliste, una a sinistra ed una a destra di x tali che: –gli elementi della prima siano non maggiori di x –gli elementi della seconda siano non minori di x –l’algoritmo appena descritto viene ripetuto ricorsivamente sulle due sottoliste fino a ordinare tutti gli elementi

Si partiziona l’array in modo che –Si sceglie come elemento di partizione un elemento (es. l’ultimo della lista) a[m] –Si usa a[m] come elemento di separazione in modo che a[i]  a[m] per ogni i < m a[i]  a[m] per ogni i > m Algoritmo di separazione

Algoritmo di Separazione s d c cd s scd L1L2 A[i]  A[8]A[i]  A[8]

sdc cs 6453 c d 453 cs

Passi dell’algoritmo di separazione –si parta da una lista a[1]...a[n] –si assume come elemento di separazione un qualsiasi elemento dell’array x in posizione c (ad esempio l’ultimo) –si cerca il primo elemento da sinistra maggiore di x. Supponiamo sia in posizione s (se tale elemento non esiste si pone s = n+1) –si cerca il primo elemento da destra minore di x. Supponiamo sia in posizione d (se tale elemento non esiste si pone d = 0) Ordinamento con doppio indice

–si ordinano gli elementi trovati in modo che x risulti al centro, a[d] vada alla sua sinistra e a[s] vada alla sua destra. Nel caso s = n+1 o d = 0 viene effettuato l’ordinamento dei soli due elementi trovati: a[c] e a[d] oppure a[s] e a[c] –in questo momento risultano a[1]...a[s] formata da elementi non maggiori di x a[d]...a[n] formata da elementi non minori di x

Ordinamento con doppio indice –sia c la nuova posizione dell’elemento di separazione x, ottenuta tramite lo spostamento precedente –mentre s < d si riparte dal punto 3 dell’algoritmo, cercando da sinistra e da destra a partire da s e da d

Int separa(int a[], int left, int right) { Int s = left –1; Int d = right; Int p = a[right]; Int temp; for(;;) { while (a[++s] >p && (s<right)) ; while (p < a[- -d]) if (d = = left) break; if (s>=d) break; temp=a[s]; a[s]=a[d]; a[d]=temp; } temp=a[s]; a[s]=a[right]; a[right]=temp; return s; }

La routine quicksort voidquicksort(int lista[], int a, int z) { intcf = 0; if(z>a) { cf = separa(lista, a, z); quicksort(lista, a, cf-1); quicksort(lista, cf+1, z); }

Ordinamento per Distribuzione e Fusione L’algoritmo Merge Sort prevede 3 passi: –Suddividi l’array in duw sottoarray – ordina i sottoarray; –esegui la fusione dei sottoarray ordinanti in un unico vettore.

Problema della fusione di due liste ordinate: –Siano V1 e V2 due vettori ordinati di dimensione rispettivamente N1 ed N2. Siano i e j gli indici rispettivamente su V1 e V2. Il vettore fusione V si otterrà con la seguente procedura: Si confrontano il primo elemento di V1 ed il primo elemento di V2. L’elemento minore verra copiato in V, quindi verranno incrementati gli indici k su V ed i su V1 se l’elemento minore è stato ottenuto da V1, j su V2 se l’elemento minore è stato ottenuto da V2; Si iterano i confronti finché non si raggiunge il termine di V1 o V2, quindi si completa il vettore fusione V con gli elementi del vettore per il quale non si è giunti ancora al termine.

Fusione di due vettori ordinati

Nucleo della funzione merge: void merge(V1,V2) { i = j = 0; // Ciclo di fusine delle due liste while ((i < N1) && (j < N2)) { // Confronto tra gli elementi di V1 e V2 if(V1[i] < V2[j]) // L’elemento copiato in V proviene da V1 V[k++] = V1[i++]; else // L’elemento da inserire in V proviene da V2 V[k++] = V2[j++]; } // Completamento del vettore V if ( i < N1 ) // Il vettore V deve essere completato con gli elementi di V1 while (i < N1) V[k++] = V1[i++]; else // Il vettore V deve essere completato con gli elementi di V2 while (j < N2) V[k++] = V2[j++]; }

Problema della distribuzione - Descrizione della procedura sort: –La suddivisione di una lista in sottoliste ordinate avviene in questo modo: se la lista contiene più di due elementi viene calcolato il punto medio della lista, vengono create due sottoliste a partire da esso ed infine, viene richiamata ricorsivamente la funzione di sort per entrambe le sottoliste create; se la lista è costituita da due elementi (condizione di uscita dalla ricorsione), si procede con un confronto ed eventuale scambio dei due elementi; questo garantisce la restituzione di sottoliste ordinate.

Nucleo della procedura sort: Void sort(V) { if(Lunghezza > 2) { // La procedura separa divide la lista V in due vettori V1 e V2 separa(V,V1,V2); // Chiamate ricorsive su V1 e V2 sort(V1); sort(V2); // fusione delle liste merge(V1,V2); } else // Raggiunta la condizione di uscita dalla ricorsione if(V[1] > V[2]) // Effettua lo scambio { scambio = V[1]; V[1] = V[2]; V[2] = V[1]; }

Merge Sort Void mergesort(listaCompleta) { sort(listacompleta); }