Corso di Fondamenti di Informatica



Похожие документы
RICERCA IN UN VETTORE

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

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

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

Fondamenti di Informatica

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java

A. Ferrari. algoritmi notevoli. Python. Alberto Ferrari Informatica

Algoritmi di Ricerca Ordinamento

A. Ferrari Algoritmi notevoli

RICERCA BINARIA...1 ALBERO BINARIO DI RICERCA (ABR)...3 RICORSIONE...4 ESEMPI DI RICORSIONE IN VISUAL BASIC...5 ESEMPI DI RICORSIONE IN C / C++...

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

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

Algoritmi di ordinamento. Algoritmi. Selection sort semplificato - I. Selection sort semplificato - II

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

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

Ordinamento di una lista: bubble-sort

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

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

Strutture dati e algoritmi. Sommario

PASCAL: I VETTORI TRATTO DA CAMAGNI-NIKOLASSY, CORSO DI INFORMATICA, VOL. 1, HOEPLI. Informatica

ADT Coda con priorità

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

Lezione 6 Selection/Insertion Sort su interi e stringhe

Strutture dati dinamiche

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

ESERCITAZIONE MICROECONOMIA (CORSO B) ESEMPI DI ESERCIZI DI TEORIA DEI GIOCHI

Calcolo Parallelo e Distribuito

Esercitazione 3. Heapsort

Calcolo Parallelo e Distribuito

Esercizi C su array e matrici

Esercizi di Algoritmi e Strutture Dati

Implementazione ADT: Alberi

Per semplicità eliminiamo le ripetizioni nell'albero.

Транскрипт:

Corso di Fondamenti di Informatica Gli algoritmi di base sul tipo array: ordinamento e ricerca Claudio De Stefano - Corso di Fondamenti di Informatica 1

Algoritmi di ordinamento gli algoritmi si differenziano anche molto in base alla loro classe di complessità, ma una graduatoria di efficienza non è sempre facile da definirsi perché le loro prestazioni (tempi di ordinamento) possono anche dipendere dal particolare vettore da ordinare. Gli algoritmi di ordinamento classici sono: Ordinamento per selezione. Ordinamento per inserimento. Ordinamento a bolle.

ordinamento per selezione supponendo di dover ordinare il vettore in senso crescente, si parte selezionando l elemento più piccolo e ponendolo al primo posto; si procede applicando lo stesso processo al sottovettore non ordinato e così via fino a che quest'ultimo si riduce ad un solo elemento (il maggiore del vettore) l'ordinamento per selezione compie n-1 iterazioni Ordinamento per selezione del vettore di interi 11, 9, 17, 5, 14: Iterazione 0: 9<11 => selezione: 9 17>9 => niente 5<9 => selezione: 5 14>5 => niente scambio: 5,9,17,11,14 Iterazione 1: 17>9 => niente 11>9 => niente 14>9 => niente Iterazione 2: 11<17 => selezione: 11 14>11 => niente scambio: 5,9,11,17,14 Iterazione 3: 14<17 => selezione: 14 scambio: 5,9,11,14,17 (Vettore ordinato)

ordinamento per inserimento consiste nell'inserire un elemento alla volta nella posizione che gli spetta in un vettore già ordinato, partendo dal vettore vuoto. Ad esempio, nel caso del vettore di interi A = 50, 20, 40, 80, 30:

ordinamento a bolle per ogni iterazione si confrontano elementi adiacenti e si scambiano i loro valori quando il primo elemento è maggiore del secondo: alla fine di ogni iterazione, l elemento maggiore è «gorgogliato» fino alla cima del vettore attuale; i passi dell'algoritmo sono: Nell iterazione 0 si confrontano gli elementi adiacenti (A[0],A[1]),(A[1],A[2]),(A[2],A[3]),...(A[n-2],A[n-1]) si effettuano n-1 confronti; per ogni coppia (A[i], A[i+1]) si scambiano i valori se A[i+1] < A[i]; alla fine dell'iterazione, l elemento maggiore del vettore sarà situato in A[n-1] All iterazione 1 si effettuano gli stessi confronti e scambi, terminando con il secondo elemento maggiore in A[n-2] il processo termina con l'iterazione n-1, nella quale l elemento più piccolo si trova in A[0]

ricerca sequenziale confronta ogni elemento dell array con una chiave di ricerca; comincia col primo elemento e attraversa i restanti confrontandoli con la chiave finché se ne trova uno con il valore chiave cercato o finché termina il vettore; se l'elemento viene trovato se ne restituisce l indice, altrimenti si restituisce il valore 1

ricerca sequenziale in vettore ordinato confronta ogni elemento dell array con una chiave di ricerca; comincia col primo elemento e attraversa i restanti confrontandoli con la chiave finché se ne trova uno con il valore chiave cercato, o se ne trova uno con valore maggiore, o finché termina il vettore; se l'elemento viene trovato se ne restituisce l indice, altrimenti si restituisce il valore 1 Claudio De Stefano - Corso di Fondamenti di Informatica 7

ricerca binaria se il vettore è ordinato in base al campo che contiene il valore da cercare allora la ricerca binaria è certamente la migliore; si inizia dal centro del vettore: se l'elemento centrale non contiene la chiave cercata, allora si esamina l'elemento centrale del semivettore destro o di quello sinistro a seconda del fatto che la chiave dell'elemento esaminato sia maggiore o minore di quella cercata; il procedimento và avanti con semivettori sempre dimezzati fino a trovare, se c'è, l'elemento cercato. int RicercaBin (TipoDato v[], int basso, int alto, Tipodato chiave) { int centrale; TipoDato valorecentrale; while (basso <= alto) { centrale = (basso + alto)/2; // indice elemento centrale valorecentrale = v[centrale]; // valore dell indice centrale if (chiave == valorecentrale) return centrale; // trovato valore; restituisce posizione else if (chiave < valorecentrale) alto = centrale 1; // andare al semivettore inferiore else basso = centrale + 1; // andare al semivettore superiore } // elemento non trovato return -1; }