Algoritmi di ordinamento: Array e ricorsione

Похожие документы
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

Informatica 1. Prova di recupero 21 Settembre 2001

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

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

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

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

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

Inserimento in una lista ordinata

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Esercitazione 11. Liste semplici

Heap e code di priorità

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

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Analisi asintotica della complessità di tempo degli algoritmi

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

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

Stringhe e allocazione dinamica della memoria

Esercizio 1: Puntatori impiegati che sono manager

Algoritmi di Ricerca. Esempi di programmi Java

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

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO

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

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) :

PROVETTE D ESAME. Algoritmi e Strutture Dati

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

Scrittura formattata - printf

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

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

Programmazione I - Laboratorio

Esercitazione 8. Array multidimensionali

Corso di Tecniche di Programmazione

Транскрипт:

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