Algoritmi di ordinamento: Array e ricorsione

Documenti analoghi
Algoritmi di ordinamento: Array e ricorsione

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

Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine. Ipotesi: gli elementi siano memorizzati in un array.

Ordinamento per inserzione e per fusione

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

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

Programmazione I - corso B a.a prof. Viviana Bono

Informatica 1. Prova di recupero 21 Settembre 2001

Si può fare di meglio?

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

Lezione 8 programmazione in Java. Anteprima. La ricorsione. Nicola Drago Dipartimento di Informatica Università di Verona

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

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

Fondamenti di Informatica

Algoritmi di ordinamento

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Esercitazione 6. Array

Esercizi C su array e matrici

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Problemi di ordinamento

2. Analisi degli Algoritmi

Calcolare x n = x x x (n volte)

Parallel sorting. Algoritmi Avanzati. Davide Lo Re

Sommario. Ordinamento. Selection Sort Bubble Sort/ Shaker Sort Shell Sort

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Lezione 8 Struct e qsort

Come usare la ricorsione

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Programmazione I - Laboratorio

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

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

Corso di Informatica Medica Esercitazione 1I ! Alessandro A. Nacci - alessandronacci.com

Inserimento in una lista ordinata

Un vettore è una struttura dati che permette di memorizzare sequenze di dati omogeneii (sequenze di interi, di valori booleani,...

ALGORITMI E STRUTTURE DATI

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Esercizio 1: calcolo insieme intersezione

Esercitazione 11. Liste semplici

Heap e code di priorità

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

Algoritmi di ordinamento e ricerca. Classe SelSort.java

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Analisi asintotica della complessità di tempo degli algoritmi

Programmazione di base

C: panoramica. Violetta Lonati

5. DIVIDE AND CONQUER I

Esercizi. Stringhe. Stringhe Ricerca binaria

Un esempio di calcolo di complessità: insertion sort

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi e Strutture Dati Laboratorio 15/12/2008. Daniele Loiacono

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

Fondamenti di Informatica T-1 Modulo 2

Divide et impera. Divide et impera. Divide et impera. Divide et impera

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

RICORSIONE. Informatica B - A.A. 2013/2014

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

Stringhe e allocazione dinamica della memoria

Esercizio 1: Puntatori impiegati che sono manager

Il presente plico contiene 3 esercizi e deve essere debitamente compilato con cognome e nome, numero di matricola.

Algoritmi di Ricerca. Esempi di programmi Java

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

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

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO

Permutazioni. 1 Introduzione

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Lezione 6 Selection/Insertion Sort su interi e stringhe

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Parte 2. Ricorsione. [M.C.Escher Drawing hands, 1948] - AA. 2012/13 2.1

Esercitazione 7. Procedure e Funzioni

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

ADT Coda con priorità

Cognome e Nome : Corso e Anno di Immatricolazione: Modalità di Laboratorio (Progetto/Prova) :

Ordinamento. Lorenzo Donatiello,Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna

Bubble Sort. Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica. Elaborato di Algoritmi e Strutture Dati. Anno Accademico 2011/2012

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a.

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

Array ( vettore/matrice Un dato strutturato. indice Accesso diretto

PROVETTE D ESAME. Algoritmi e Strutture Dati

Ordinamento. Scoperta guidata di tipici algoritmi: selection sort, bubble sort

Algoritmi di ordinamento

Scrittura formattata - printf

PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008

Programmazione di base

Anche se due variabili vettore sono dello stesso tipo, NON è possibile l assegnamento diretto:

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

Corso: Fondamenti di Informatica (Canale 5) a.a Corsi di laurea: Ing. Settore Informazione

ESERCIZIO: Lettura/Scrittura Array

Calcolare lo Span di un array di numeri

Algoritmo di ordinamento per scambio (a bolle o bubble sort)

Programmazione I - Laboratorio

Esercitazione 8. Array multidimensionali

Corso di Tecniche di Programmazione

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 21 Gennaio 1998

Transcript:

Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1

Indice Algoritmi di ordinamento: Insertion Sort Codice Complessità Documentazione Mergesort Ordinamento ricorsivo 3 Insertion Sort L insertion Sort è uno algoritmo di ordinamento molto efficiente per ordinare un piccolo numero di elementi L idea di ordinamento è simile al modo che un giocatore di bridge potrebbe usare per ordinare le carte nella propria mano. Si inizia con la mano vuota e le carte capovolte sul tavolo Poi si prende una carta alla volta dal tavolo e si inserisce nella giusta posizione Per trovare la giusta posizione per una carta, la confrontiamo con le altre carte nella mano, da destra verso sinistra. Ogni carta più grande verrà spostata verso destra in modo da fare posto alla carta da inserire. 4 2

Esempio di Insertion Sort 5 Funzione Insertion Sort void insertion(int interi[20],int tot) int temp; /* Indice temporaneo per scambiare elementi */ int prossimo; int attuale; for (prossimo=1;prossimo<tot;prossimo++) temp=interi[prossimo]; attuale=prossimo-1; while ((attuale>=0) && (interi[attuale]>temp)) interi[attuale+1]=interi[attuale]; attuale=attuale-1; interi[attuale+1]=temp; 2 4 5 3 6 9 8 1 6 3

Programma per Insertion Sort # include <stdio.h> # define MAX 20 int i,j; /* Indici di scorrimento dell'array */ void insertion(int interi[max],int tot); main() int interi[max] /* Array che contiene i valori da ordinare */ int tot; /* Numero totale di elementi nell'array */ printf("\nquanti elementi deve contenere l'array: "); scanf("%d",&tot); while (tot>20) printf("\n max 20 elementi: "); scanf("%d",&tot); for (i=0;i<tot;i++) printf("\ninserire il %d elemento: ",i+1); scanf("%d",&interi[i]); insertion(interi,tot); printf("\narray Ordinato:"); for (i=0;i<tot;i++) printf(" %d",interi[i]); 7 Ingegneria del software... Autore: Nome, Cognome, matricola Titolo: nome della funzione (o modulo) implementata. Scopo: obiettivi dell algoritmo implementato(sintetico) Specifiche: Nomi di funzioni, array, variabili importanti Descrizione: Informazioni sull algoritmo implementato. Lista dei Parametri: Parametri input e output Complessità di Tempo e Di Spazio Altri parametri eventualmente vuoti: Indicatori di Errore: Routine Ausiliarie Indicazioni sull utilizzo Implementazione 8 4

Documentazione per Insertion Sort Scopo : Ordinamento di un array di numeri interi dato in ingresso Specifiche: array di interi interi[max] void insertion(int interi[max], int tot); Descrizione : L insertion sort è un algoritmo molto efficiente per ordinare pochi numeri. Questo algoritmo è simile al modo che si potrebbe usare per ordinare un mazzo di carte Lista dei Parametri Input: interi[ ]: vettore contenente gli elementi da ordinare tot numero degli elementi contenuti nel vettore Output: array interi[ ] ordinato in ordine crescente. 9 Documentazione per Insertion Sort Complessità di Tempo L algoritmo inserisce il componente interi[i] nel vettore già ordinato di componenti interi[0]...interi[i-1] spostando di una posizione tutti i componenti che seguono quello da inserire. Ad ogni passo la procedura compie nel caso peggiore (vettore ordinato al contrario), N-1 confronti, essendo N la lunghezza del vettore corrente e i-1 spostamenti. Le operazioni nel caso peggiore sono dunque (1+2+...+N-1), cioè, nel caso peggiore la complessità asintotica di tempo è O(n 2 ). Nel caso migliore (vettore ordinato) bastano N-1 confronti. 10 5

Documentazione per Insertion Sort Complessità di Spazio: La struttura dati utilizzata per implementare l algoritmo è un ARRAY monodimensionale, contenente i valori da ordinare, di conseguenza la complessità di spazio è O(n). Esempi di esecuzione: Dati in ingresso i numeri: 20 11 45, si ottiene in uscita: 11 20 45 Si veda il documento Documentazione InsertionSort.pdf 11 Merge Sort L algoritmo di Merge Sort per mette di ordinare una sequenza di numeri memorizzata in un array utilizzando il seguente ragionamento: Si suddivide l'array in due parti di ugual lunghezza con l'obiettivo di applicare alle due parti contigue la procedura di fusione per ottenere il vettore finale ordinato. Poiché i due vettori di partenza devono essere ordinati, riapplica ricorsivamente il metodo a questi vettori 12 6

Esempio di Esecuzione 13 Funzione Merge Sort void merge_sort(int interi[], int indice_basso, int indice_alto) int indice_di_mezzo; /* se ndice_alto==indice_basso la lista ha un solo elemento */ if(indice_alto==indice_basso) return; /* calcolo dell indice a meta' dell'array */ indice_di_mezzo=(indice_alto-indice_basso)/2+indice_basso; /* potrei ottenere anche semiliste di un solo elemento */ merge_sort(interi,indice_basso,indice_di_mezzo); merge_sort(interi, indice_di_mezzo+1, indice_alto); /* le due semiliste sono ordinate e basta fonderle */ fuse(interi, indice_basso, indice_di_mezzo, indice_alto); 14 7

Complessità di Merge Sort Detto k = log 2 N, le chiamate alla procedura mergesort sono in numero di 1+2+4+...+ 2 k = 2 0 +2 1 +2 2 +... + 2 k = 2 k+1. Ad ogni livello di ricorsione, si fa la fusione di M vettori di lunghezza L/M Poiché il numero di confronti necessari alla funzione di fusione nel caso peggiore è 2*L, ogni livello compie: 2*L*M/2 = L*M confronti Pertanto, il numero globale di confronti e': 1*N+2*N/2 + 4*N/4 +... + N*1 = N * log 2 N 15 Esercizio di laboratorio Implementare una funzione per la fusione Scrivere un main che a scelta multipla permetta di ordinare una sequenza di numeri utilizzando l insertion Sort oppure il Merge Sort. 16 8

Nella prossima lezione In occasione della festività del 1/11, anticipiamo la lezione sugli Stack programmata per l 1/11 il giorno 28/10. 17 9