Algoritmi di ordinamento. Sequential-sort, Bubble-sort, Quicksort

Documenti analoghi
ALGORITMI DI ORDINAMENTO. Naive sort (o selection sort): Consideriamo algoritmi di ordinamento interni (elementi in memoria centrale).

Linguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità.

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Ricerca binaria (o dicotomica) di un elemento in un vettore

Due algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort

Fondamenti di Informatica CdL Ingegneria Meccanica A.A. 2013/14

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Algoritmi di Ricerca. Esempi di programmi Java

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Albero di Riscorsione

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Laboratorio di Algoritmi e Strutture Dati II Semestre 2005/2006. Ordinamenti: mergesort e quicksort

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Consideriamo un vettore allocato dinamicamente

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

La ricerca. Sequenziale Binaria L ordinamento. Selection Sort Appendice: Quick Sort. Sommario FONDAMENTI DI INFORMATICA 1. Ricapitolando un po

Fondamenti di Informatica 2

Si può fare di meglio?

Sapendo che il vettore è ordinato, la ricerca può essere ottimizzata Vettore ordinato in senso non decrescente: Vettore ordinato in senso crescente:

Programmazione I - Laboratorio

Gestione di stringhe. Le stringhe in C/C++

Corso di Tecniche di Programmazione

Algoritmi di ordinamento (II parte)

Esercitazione 6. Array

Ricerca sequenziale di un elemento in un vettore

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

GESTIONE INFORMATICA DEI DATI AZIENDALI

SOMMARIO IL PROBLEMA DELLA RICERCA. Algoritmi di ricerca: Algoritmi di ordinamento: RICERCA LINEARE

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Esercitazione 12. Esercizi di Ricapitolazione

Obiettivi di questa esercitazione

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

Introduzione ai puntatori in C Definizione

Algoritmi di ordinamento in linguaggio C

Fondamenti di Informatica

Strutture Dinamiche. Fondamenti di Informatica

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Informatica 1. Prova di recupero 21 Settembre 2001

Corso di Fondamenti di Informatica

Costo di esecuzione e complessità. Modello di costo e complessità di un algoritmo

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Strutture dati e algoritmi. Sommario

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

QuickSort (1962, The Computer Journal)

s r t i r n i g n. g h s r t c r p c y s r t c r a c t s r t c r m c p s r t c r h c r s r t s r t s r

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Introduzione al C. Unità 8 Stringhe

Laboratorio di Informatica

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 5A di Mercoledì 13 Luglio 2011 tempo a disposizione 2h

Gli algoritmi di Ricerca e di Ordinamento

Corso di Fondamenti di Informatica Algoritmi su array / 2

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Note per la Lezione 4 Ugo Vaccaro

Esercizi di Algoritmi e Strutture Dati

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Algoritmi su array / 2

LA COMPLESSITA DEGLI ALGORITMI

La gestione della memoria dinamica Heap

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a febbraio 2013

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:

L evoluzione di un Automa Cellulare Toroidale

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Espressioni. Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica!

Informatica B

Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi:

La ricorsione. Ver Claudio Fornaro - Corso di programmazione in C

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Strutture dati dinamiche in C (II)

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

Esercizi Capitolo 6 - Alberi binari di ricerca

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Algoritmi e Strutture Dati. HeapSort

Esercizi di Algoritmi e Strutture Dati

Inserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux

Zeri di una funzione. Funzioni continue - Proprietà. certo intervallo dell'asse x. da: a ξ. cui f(x)=0. precisione desiderata (iterazione( iterazione)

Librerie C. Corso di Linguaggi e Traduttori 1 AA

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

I puntatori e l allocazione dinamica di memoria

Corso di Informatica 1 Esercitazione n. 4

Corso di Fondamenti di Informatica. La ricorsione

una matrice quadrata, determini se è un Un quadrato magico è una matrice NxN

Esercitazione 7. Procedure e Funzioni

ESERCIZIO n. 1. Soluzione: (Uso dei vettori) #include <iostream.h> #include <stdlib.h> #define MAXLEN 100. int main( ) {

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Transcript:

Algoritmi di ordinamento Sequential-sort, Bubble-sort, Quicksort

Definizione Dato un multi-insieme V={Vn} N-1 n=0 di valori in D, il problema dell ordinamento è trovare una permutazione n(j) degli indici n tale che j2 j1 Vn(j2) Vn(j1)

Sequential-sort Richiede la ricerca del massimo valore dell insieme ed un operazione di swap Si seleziona l elemento massimo di V e si scambia di posizione con l elemento nell ultima posizione si prosegue allo stesso modo sui primi N-1 elementi

Sequential-sort: costo ΓSeqS(N)= c1 N + c2+ ΓSeqS(N-1) se N>1, c2 se N==0 dove c1 N costo di selezione, c2 costo di swap Eseguendo i conti: CSeqS(N)=O(N 2 )

Sequential-sort: implementazione void seqsort(struct data *V, int N, int *perm) { int count, countmax, iter; for (count=0; count<n; count++) perm[count]=count; } for (iter=0; iter<(n-1); iter++) { for (count=1, countmax=0; count<(n-iter); count++) if ( isgreater(v[perm[count]], V[perm[countMax]]) ) countmax = count; swap( perm, countmax, N-iter-1 ); }

Sequential-sort: ottimizzazione Si può cercare di sostituire massimo e minimo contemporaneamente si dimezza il numero di iterazioni, che diventano più costose computazionalmente la ricerca contemporanea di massimo e minimo è comunque meno costosa (il guadagno è qui)

Sequential-sort: ottimizzazione Ricerca contemporanea di massimo e minimo: if (x>y) { if (x>max) max=x; if (y<min) min=y; } else { if (y>max) max=y; if (x<min) min=x; } NOTA: il costo rimane O(N 2 ), stiamo riducendo i confronti da 4 a 3

Bubble-sort Richiede il confronto e lo swap di elementi successivi, iterando sui dati All iterazione k si scandiscono le posizioni da 0 a N-k-1, confrontando gli elementi [posizione] e [posizione+1], eventualmente permutando le posizioni non ordinate Se non si scambia nessun elemento non si itera più

Bubble-sort: proprietà i. un elemento che all inizio dell iterazione NON è preceduto da alcun maggiorante avanza fino ad incontrare il primo; se non ha maggioranti avanza fino all ultima posizione ii. un elemento che all inizio dell iterazione è preceduto da almeno un maggiorante, al termine dell iterazione è arretrato di UNA posizione

Bubble-sort: esempio L algoritmo è asimmetrico: per le proprietà i e ii i valori più grandi salgono velocemente mentre i piccoli al massimo scendono di una posizione

Bubble-sort: esempio L algoritmo è asimmetrico: per le proprietà i e ii i valori più grandi salgono velocemente mentre i piccoli al massimo scendono di una posizione

Bubble-sort: costo Dopo k iterazioni gli ultimi k elementi sono nelle posizioni corrette (proprietà i), dobbiamo iterare solo sulle prime N-k posizioni ΓBubS(N)= (s+c) N + ΓBubS(N-1) se N>1, c2 se N==0 dove c è il costo di confronto, s costo di swap ΓBubS(N)=(s+c)(N-1)(N-2) CBubS(N)=O(N 2 ) 2

Bubble-sort: costo Possiamo terminare senza aver fatto tutte le N-2 iterazioni: nell algoritmo sequenziale NO Posso dover fare (N-1)(N-2) swap: nel sequenziale ne facciamo sempre (N-1) il meccanismo di virtualizzazione dell ordine diventa importante

Bubble-sort: implementazione void bubblesort(struct data *V, int N, int *perm) { int iter; Boolean noswap; Boolean swapfound; iter = 0; noswap = FALSE; } while ( noswap == FALSE ) { for (count=0, swapfound=false; count<n-iter-1; count++) { if ( issmaller(v[perm[count]], V[perm[count+1]]) ) { swap( perm, count, count+1); // virtualizzazione dell ordine swapfound = TRUE; } } if ( swapfound == FALSE ) noswap = TRUE; else iter++; }

Quicksort Algoritmo di tipo divide et impera come Mergesort introdotto nel 1960 da C.A.R. Hoare tipica implementazione ricorsiva disponibile nella libreria standard C Richiede di risolvere un problema di partizione

Quicksort: algoritmo di partizione Si riarrangiano gli elementi di un vettore in modo che un elemento pivot sia portato in posizione tale da avere alla sua sinistra solo elementi minori o uguali e a destra elementi maggiori Scelta del pivot: l elemento in una posizione tipica del vettore (es. primo) o scelta casuale

Quicksort: algoritmo ricorsivo si sceglie un elemento dell array (il pivot ) si suddividono gli altri elementi in due gruppi: quelli piccoli che sono minori del pivot quelli grandi che sono maggiori o uguali al pivot si ordina ricorsivamente ogni gruppo

Quicksort: proprietà Gli elementi minori del pivot NON devono essere confrontati con i maggiori; altrettanto i maggiori con i minori nell ordinamento sequenziale o bubblesort ogni elemento è confrontato con gli altri

Quicksort: esempio

Quicksort: esempio

Quicksort: implementazione void quicksort( int v[], int n) { int i, last; } if (n <= 1) return; swap(v, 0, rand()%n); // pivot random, spostato in v[0] last = 0; for ( i=1; i<n; i++ ) if ( v[i] < v[0]) swap( v, ++last, i); swap( v, 0, last ); // recupera il pivot // ordina ricorsivamente le due parti quicksort( v, last ); quicksort( v+last+1, n-last-1 ); void swap(int v[], int i, int j) { int temp; temp=v[i]; v[i]=v[j]; v[j]=temp; }

All inizio del processo il pivot viene messo nella prima posizione Dopo che tutti gli elementi sono stati suddivisi l elemento 0 viene scambiato con l elemento last per rimettere il pivot nella posizione finale

All inizio del processo il pivot viene messo nella prima posizione Dopo che tutti gli elementi sono stati suddivisi l elemento 0 viene scambiato con l elemento last per rimettere il pivot nella posizione finale

All inizio del processo il pivot viene messo nella prima posizione Dopo che tutti gli elementi sono stati suddivisi l elemento 0 viene scambiato con l elemento last per rimettere il pivot nella posizione finale

Quicksort: funzione di libreria La funzione di libreria qsort deve ricevere la funzione di comparazione come parametro si usa un puntatore a funzione la funzione deve poter lavorare su qualsiasi tipo, quindi riceve puntatori void e poi ne fa il cast appropriato

Quicksort: funzione di libreria void qsort (void *base, size_t nel, size_t width, int (*compar)(const void *, const void *)); Quicksort di nel oggetti, il cui elemento iniziale è puntato da base. Ogni oggetto ha dimensione width. La comparazione è fatta dalla funzione compar.

Funzione di comparazione: esempio int icmp(const void *p1, const void *p2) { int v1, v2; } v1 = *(int *)p1; v2 = *(int *)p2; if( v1 < v2 ); return -1; else if ( v1 == v2 ) return 0; else return 1;

Quicksort: esempio di uso della libreria int arr[n]; qsort( arr, N, sizeof(arr[0]), icmp);

Esempio di uso di puntatore a funzione #include <stdio.h> #include <stdlib.h> #include <string.h> void controlla(char *a, char *b, int (*cmp)(char *a1, char *b1)); int main (int argc, const char * argv[]) { char s1[80],s2[80]; int (*p)(); p=strcmp; gets(s1); gets(s2); controlla(s1,s2,p); } return 0; void controlla(char *a, char *b, int (*cmp)(char *a1, char *b1)) { } printf("controllo %s e %s\n",a,b); if(!(*cmp)(a,b)) printf("uguali\n"); else printf("diversi\n");