Algoritmi di ordinamento. Algoritmi. Selection sort semplificato - I. Selection sort semplificato - II
|
|
|
- Rosalinda Pinna
- 9 anni fa
- Просмотров:
Транскрипт
1 Algoritmi Ver..4 Algoritmi di ordinamento Lo scopo è ordinare in senso [de]crescente il contenuto di un vettore di N elementi senza utilizzare un secondo vettore Esiste molta letteratura scientifica a riguardo e molti metodi adatti a vari casi, ma qui si considerano tre semplici algoritmi di esempio molto per l ordinamento in senso crescente (o meglio, non-decrescente): Selection sort Bubble sort Insertion sort Claudio Fornaro - Corso di programmazione in C Selection sort semplificato - I Si confronta il primo elemento del vettore con tutti gli altri, man mano che si trova un valore minore del primo, lo si scambia con il primo. Dopo questa operazione il valore minimo è nella prima posizione (pos. 0) del vettore for (j= 1; j<n; j++) if (v[j] < v[0]) v[j] = v[0]; v[0] = tmp; è il successivo a Selection sort semplificato - II Se si ripete lo stesso identico procedimento per tutti gli elementi a partire dal secondo, si determina il secondo valore più piccolo e lo si colloca al secondo posto for (j= ; j<n; j++) if (v[j] < v[1]) v[j] = v[1]; v[1] = tmp; è il successivo a
2 Selection sort semplificato - III Se si ripete lo stesso identico procedimento per tutti gli elementi a partire dall i-esimo, si determina l i-esimo valore più piccolo e lo si colloca all i-esimo posto for (j=i+1; j<n; j++) if (v[j] < v[i]) v[j] = v[i]; v[i] = tmp; è il successivo a i 5 Selection sort semplificato -IV Se si ripete questo procedimento per tutti i valori di i da 0 fino al penultimo (l ultimo va a posto da sé) si ottiene l ordinamento in senso crescente di tutto il vettore for (i=0; i<n-1; i++) for (j=i+1; j<n; j++) if (v[j] < v[i]) v[j] = v[i]; v[i] = tmp; 6 Selection sort - I Il primo passo è quello di individuare il minimo tra gli elementi del vettore e scambiarlo con quello nella prima posizione, il primo valore è ora al posto giusto jmin = 0; for (j= 1; j<n; j++) if (v[j] < v[jmin]) jmin = j; tmp = v[jmin]; v[jmin] = v[0]; v[0] = tmp; è il successivo a Selection sort - II Se si ripete lo stesso identico procedimento per tutti gli elementi a partire dal secondo, si determina il secondo valore più piccolo e lo si colloca al secondo posto jmin = 1; for (j= ; j<n; j++) if (v[j] < v[jmin]) jmin = j; tmp = v[jmin]; v[jmin] = v[1]; v[1] = tmp; è il successivo a
3 Selection sort - III Se si ripete lo stesso identico procedimento per tutti gli elementi a partire dall i-esimo, si determina l i-esimo valore più piccolo e lo si colloca all i-esimo posto è il successivo a i jmin = i; for (j=i+1; j<n; j++) if (v[j] < v[jmin]) jmin = j; tmp = v[jmin]; v[jmin] = v[i]; v[i] = tmp; 9 Selection sort - IV Se si ripete questo procedimento per tutti i valori di i da 0 fino al penultimo (l ultimo va a posto da sé) si ottiene l ordinamento in senso crescente di tutto il vettore for (i=0; i<n-1; i++) jmin = i; for (j=i+1; j<n; j++) if (v[j] < v[jmin]) jmin = j; tmp = v[jmin]; v[jmin] = v[i]; v[i] = tmp; 10 Bubble sort - I Se si scorrono tutti gli elementi di un vettore e ogni volta che si trovano due valori ADIACENTI non in ordine (il più piccolo dei a destra del più grande) li si scambia: il più grande di tutti risale a destra for (j=0; j<n-1; j++) if (v[j] > v[j+1]) v[j] = v[j+1]; v[j+1] = tmp; Bubble sort - II Ripetendo N-1 volte questa operazione, tutti i valori risalgono verso destra fino ad occupare la posizione corretta e quindi vengono ordinati in senso crescente for (i=0 ; i<n-1; i++) for (j=0; j<n-1; j++) if (v[j] > v[j+1]) v[j] = v[j+1]; v[j+1] = tmp; 1
4 Bubble sort - III Inefficienza: gli ultimi valori vengono in ogni caso confrontati, anche quando sono già stati collocati; per evitare perdita di tempo in questi controlli inutili si ferma prima della fine il ciclo interno, sfruttando il ciclo esterno for (i=n-1; i>0 ; i--) for (j=0; j<i ; j++) if (v[j] > v[j+1]) v[j] = v[j+1]; v[j+1] = tmp; 13 Bubble sort - IV Inefficienza: se pochi valori sono fuori posto e l ordinamento si ottiene prima delle N-1 passate, i cicli continuano ad essere eseguiti. Lo si fa terminare se non ci sono stati scambi scambi = SI; for (i=n-1; i>0 && scambi ;i--) scambi = NO; for (j=0; j<i ; j++) if (v[j] > v[j+1]) scambi = SI; v[j] = v[j+1]; v[j+1] = tmp; continua solo se ci sono stati scambi 14 Insertion sort - I Per ciascuno degli elementi a partire dal o (l elemento da sistemare si chiama chiave): 1. si copia il valore della chiave in una variabile (key) -3. si scalano a destra di una posizione tutti gli elementi precedenti alla chiave finché non ne viene trovato uno con valore inferiore a key 4. al posto di quest ultimo viene messo key Notare che gli elementi a sinistra della chiave sono sempre già ordinati in senso crescente grazie alle passate precedenti 3 15 Insertion sort - II for (j=1; j<n; j++) key = v[j]; for (i=j-1; i>=0 && v[i]>key; i--) v[i+1] = v[i]; v[i+1] = key; key 3 1 ordinati
5 Esercizi 17 Algoritmi di ricerca Per ciascuno degli algoritmi di ordinamento precedentemente descritti (variazioni incluse), si scriva un programma completo che ordini in senso crescente (o meglio, non-decrescente) un vettore di N numeri interi.. Si misurino i tempi di esecuzione usando la funzione clock() in <time.h> 3. Per ciascuno degli algoritmi di ordinamento precedentemente descritti (variazioni incluse), si scriva un programma completo che ordini in senso decrescente (o meglio, noncrescente) un vettore di N numeri interi. Si vuole cercare un dato valore val in un vettore vett di N elementi Si possono considerare i due casi: vettore non ordinato vettore ordinato Ricerca in vettore non ordinato Si deve scorrere tutto il vettore in quanto val può essere in qualsiasi posizione for (i=0; i<n && vett[i]!=val; i++) ; if (i == N) printf("non trovato\n"); else printf("trovato\n"); Finché non lo trova, continua a cercare 19 Ricerca in vettore non ordinato Il ciclo termina in casi: è stato trovato il valore ha finito di cercare (invano) in tutti gli elementi Deve stabilire per quale motivo il ciclo è finito se trova: i < N se non lo trova: i = N Non si deve controllare se val è stato trovato verificando la condizione vett[i]=val perché se non lo trova i vale N e vett[n] identifica un elemento inesistente Al massimo (nel caso peggiore) fa N controlli 0
6 Ricerca in vettore ordinato Ricerca lineare 1 Ricerca in vettore ordinato Ricerca dicotomica (o binaria) Non serve scorrere tutto il vettore, ci si ferma non appena si supera il valore cercato for (i=0; i<n && vett[i]<val; i++) ; if (i<n && val == vett[i]) printf("trovato\n"); else printf("non trovato\n"); Quando vett[i] >= val il ciclo viene interrotto e si controlla se val è stato trovato Al massimo fa N controlli left=0; right=n-1; while (right>=left) m=(left+right)/; if (val==vett[m]) break; if (val<vett[m]) right=m-1; elimina la metà destra else left=m+1; elimina la metà sinistra if (val==vett[m]) printf("trovato\n"); else printf("non trovato\n"); Ricerca in vettore ordinato Dicotomica (o binaria) 3 4 Inizializza due indici left e right al primo e all ultimo indice del vettore (0 e N-1) Calcola l indice del valore centrale: m Se vett[m] è il valore cercato, termina Altrimenti se val è minore del valore centrale, arretra l indice destro right al centro m (così dimezza il numero di valori in cui cercare) Altrimenti se val è maggiore del valore centrale, avanza l indice sinistro left al centro Ripetendo questa operazione, si dimezza ogni volta il vettore Veloce: al massimo fa log (N+1) controlli Per stato si intende la situazione del programma in un dato istante (es. sta leggendo i caratteri di una parola ) Mentre il programma viene eseguito esso cambia di stato in seguito al verificarsi di eventi (es. lettura di un carattere da analizzare), la transizione può portare allo stesso stato di partenza (anello)
7 Graficamente: gli stati sono disegnati come cerchi o ovali le transizioni sono disegnate come archi orientati nei punti di partenza degli archi si indicano gli eventi che causano le transizioni di stato se appropriato (c è spazio, non sono troppe informazioni) sugli archi si indicano anche le azioni da intraprendere nelle transizioni azione evento Stato1 evento azione azione azione evento Stato evento 5 Nel codice l informazione sullo stato viene mantenuta tramite una variabile di stato, in genere di tipo enum o int Tipicamente i valori che la variabile di stato può assumere sono definiti da enum o con #define Se i valori sono costanti e dagli stati partono diverse possibili transizioni, lo switch è spesso il costrutto di elezione 6 Esempio (es. 4 sui file) Si scriva un programma che chieda il nome di un file contenente un testo qualsiasi e di questo conti quante sono le parole che iniziano con ciascuna lettera dell alfabeto. Esempio di output: Parole che iniziano con A: 45 Parole che iniziano con B: 1 Parole che iniziano con C: 7 Parole che iniziano con Z: 3 7 La variabile di stato indicherà se si stanno leggendo i caratteri di una parola (si è dentro una parola) o no (si è fuori da una parola) e quindi assumerà possibili valori: DENTRO FUORI L evento che può causare il cambiamento di stato è la lettura del carattere successivo In questo esempio ci sono solo 4 casi: stato FUORI e si legge un carattere alfabetico stato DENTRO e si legge un carattere alfabetico stato DENTRO e si legge un carattere non-alfabetico stato FUORI e si legge un carattere non-alfabetico 8
8 9 30 Più in dettaglio, se: 1. stato FUORI e si legge un carattere alfabetico: entra DENTRO e incrementa il contatore di quel car.. stato DENTRO e si legge un carattere alfabetico: resta DENTRO e non fa nulla 3. stato DENTRO e si legge un carattere non-alfab.: va FUORI dalla parola e non fa nulla 4. stato FUORI e si legge un carattere non-alfabetico: resta FUORI e non fa nulla Rappresentazione grafica corrispondente all esempio (no-op=no operation): FUORI 1.lettera 4.non-lettera incrementa contatore lettera no-op 3.non-lettera no-op DENTRO.lettera no-op Esercizi 31 Homework (Es. 4 sui file) Si scriva un programma che chieda il nome di un file contenente un testo qualsiasi e di questo conti quante sono le parole che iniziano con ciascuna lettera dell alfabeto. Lo si risolva con una soluzione a stati. Esempio di output: Parole che iniziano con A: 45 Parole che iniziano con B: 1 Parole che iniziano con C: 7 Parole che iniziano con Z: 3 Si scriva un programma che per ciascuno degli algoritmi di ordinamento visti (bubble semplice e con variazioni, selection semplificato, selection, insertion) per M volte (es. 100) riempia un vettore di N valori interi casuali (es. 1000) e lo riordini. Il programma deve misurare i tempo impiegato per gli M ordinamenti per ciascuno degli algoritmi. Impostare M e N in modo da eseguire un numero significativo di prove con vettori di dimensioni grandi ( ), medi ( ) e piccoli (100). Trarne le conclusioni.
9 Homework 6 Continuazione: Includendo <time.h> si possono usare le seguenti funzioni: time(null) restituisce un numero intero di tipo time_t che corrisponde all istante attuale difftime(time_t t, time_t t1) restituisce (come valore double) il numero di secondi intercorsi tra t1 e t Nota: il tipo time_t è in genere un sinonimo di long e si possono definire variabili di tale tipo: time_t ora, t1, t; t1=time(null); 33
Corso di Fondamenti di Informatica
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
Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento
Fondamenti di Informatica Algoritmi di Ricerca e di Ordinamento 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure l elemento
UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi
UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA Matlab: esempi ed esercizi Sommario e obiettivi Sommario Esempi di implementazioni Matlab di semplici algoritmi Analisi di codici Matlab Obiettivi
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento Alessandra Raffaetà Università Ca Foscari Venezia Corso di Laurea in Informatica Ricerca binaria Assunzione:
SOMMARIO IL PROBLEMA DELLA RICERCA. Algoritmi di ricerca: Algoritmi di ordinamento: RICERCA LINEARE
SOMMARIO IL PROBLEMA DELLA RICERCA Algoritmi di ricerca: Ricerca lineare; Ricerca binaria (su elenchi già ordinati). Dato un array e un oggetto, stabilire se l oggetto è contenuto in un elemento dell array,
Strutture dati e algoritmi. Sommario
Sommario Strutture dati e algoritmi: Ricerca (lineare e binaria) Ordinamento (per selezione) Strutture dati e algoritmi Come esempi concreti di applicazioni in C++ si useranno le strutture dati e gli algoritmi.
Corso di Tecniche di Programmazione
Problema: Data una sequenza di elementi in ordine qualsiasi, ordinarla. Corso di Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica Anno Accedemico 003/004 Proff. Giuseppe
RICERCA IN UN VETTORE
RICERCA IN UN ETTORE La ricerca controlla se gli elementi di un vettore contengono un certo valore dato (detto anche chiave K) e comunica se l'elemento cercato esiste non esiste e nel caso che esista può
Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica
Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,
Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio
Appunti di informatica Lezione 10 anno accademico 2016-2017 Mario Verdicchio Esercizio Scrivere un programma che, data una sequenza di 10 interi (scelta dall utente), la ordini in ordine crescente Soluzione
Algoritmo di ordinamento per scambio (a bolle o bubble sort)
Algoritmo di ordinamento per scambio (a bolle o bubble sort) Per ottenere un ordinamento crescente con l algoritmo di ordinamento per scambio (bubble sort) si prenno in considerazione i primi due elementi
Introduzione alla programmazione
Introduzione alla programmazione Risolvere un problema Per risolvere un problema si procede innanzitutto all individuazione Delle informazioni, dei dati noti Dei risultati desiderati Il secondo passo consiste
Esercitazione 4. Comandi iterativi for, while, do-while
Esercitazione 4 Comandi iterativi for, while, do-while Comando for for (istr1; cond; istr2) istr3; Le istruzioni vengono eseguite nel seguente ordine: 1) esegui istr1 2) se cond è vera vai al passo 3 altrimenti
PASCAL: I VETTORI TRATTO DA CAMAGNI-NIKOLASSY, CORSO DI INFORMATICA, VOL. 1, HOEPLI. Informatica
PASCAL: I VETTORI TRATTO DA CAMAGNI-NIKOLASSY, CORSO DI INFORMATICA, VOL. 1, HOEPLI Informatica I dati strutturati: gli array I vettori (o Array) Fino a ora abbiamo memorizzato le informazioni (valori)
Algoritmi di Ricerca Ordinamento
Algoritmi di Ricerca e Ordinamento Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Appunti Di Informatica Prof. Accarino 1 Algoritmi classici In ambito informatico alcuni problemi si presentano
A lezione sono stati presentati i seguenti passi per risolvere un problema:
Calcolo delle radici di un polinomio Problema: Dati i coefficienti a,b,c di un polinomio di 2 grado della forma: ax^2 + bx + c = 0, calcolare le radici. A lezione sono stati presentati i seguenti passi
Rappresentazione degli algoritmi
Rappresentazione degli algoritmi Universitá di Ferrara Ultima Modifica: 21 ottobre 2014 1 1 Diagramma di flusso Utilizzare il diagramma di flusso per rappresentare gli algoritmi che risolvono i seguenti
A. Ferrari Algoritmi notevoli
Algoritmi notevoli in linguaggio C algoritmi o o o ricerca (verificare la presenza di un valore in un array) o o o ricerca sequenziale (array non ordinato) ricerca sequenziale (array ordinato) ricerca
Ricerca binaria (o dicotomica) di un elemento in un vettore
Ricerca binaria (o dicotomica) di un elemento in un La ricerca binaria o dicotomica è utilizzata per ricercare i dati in un ORDNATO. L algoritmo di ricerca binaria, dopo ogni confronto, scarta metà degli
ALGORITMI Docente: Prof. Domenico Cantone
CORSO SPECILE DI DURT NNULE PER IL CONSEGUIMENTO DELL BILITZIONE LL INSEGNMENTO NELL SCUOL SECONDRI DI I e II GRDO Indirizzo Fisico - Informatico - Matematico a.a. 00/07 - Classe - Informatica LGORITMI
Algoritmi di ordinamento
Algoritmi di ordinamento! Selection Sort! Quick Sort! Lower bound alla complessità degli algoritmi di ordinamento Ordinamento 1 Selection Sort SelectionSort(dati[]) { for (i=0; idati.length-1; i++) { min
Calcolo Parallelo e Distribuito
Calcolo Parallelo e Distribuito 1 Problema Progettare un algoritmo parallelo per l ordinamento di un vettore su un calcolatore MIMD a memoria distribuita con p processori Sorting Bitonico A. Murli Calcolo
10 - Programmare con gli Array
10 - Programmare con gli Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it
Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software
Introduzione alla programmazione Algoritmi e diagrammi di flusso F. Corno, A. Lioy, M. Rebaudengo Sviluppo del software problema idea (soluzione) algoritmo (soluzione formale) programma (traduzione dell
Calcolo Parallelo e Distribuito
Calcolo Parallelo e Distribuito 1 Problema Progettare un algoritmo parallelo per l ordinamento di un vettore su un calcolatore MIMD a memoria distribuita con p processori Sorting Bitonico A. Murli Calcolo
Esercizi C su array e matrici
Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza,, ordinamento, ricerca e merge, matrice simmetrica, puntatori Array Array o vettore Composto da una serie di celle int vett[4]
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
Algoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
Introduzione a Visual Basic Lezione 2 Cicli e anomalie
a Visual Basic Lezione 2 Mario Alviano Introduzione all informatica Università della Calabria http://alviano.net/introinfo A.A. 2008/09 Introduzione Perché i cicli? Un esempio concreto Finora abbiamo visto
Programmazione I - Laboratorio
Programmazione I - Laboratorio Esercitazione 3 - Array Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento
Esercizi su Python. 14 maggio Scrivere una procedura che generi una stringa di 100 interi casuali tra 1 e 1000 e che:
Esercizi su Python 14 maggio 2012 1. Scrivere una procedura che generi una stringa di 100 interi casuali tra 1 e 1000 e che: 1. conti quanti elementi pari sono presenti nella lista; 2. conti quanti quadrati
La ricorsione. Ver Claudio Fornaro - Corso di programmazione in C
La ricorsione Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C 2 Divide et impera Metodo di approccio ai problemi che consiste nel dividere il problema dato in problemi più semplici I risultati
Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 12 Array e Oggetti A. Miola Dicembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Array e Oggetti 1 Contenuti Array paralleli
Problema. Vettori e matrici. Vettori. Vettori
e matrici Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Problema Si vuole un programma che chieda 10 numeri dalla tastiera e li visualizzi dall ultimo al primo Soluzione attuale (con le
COGNOME E NOME (IN STAMPATELLO) MATRICOLA
Politecnico di Milano Facoltà di Ingegneria dell Informazione Informatica 3 Proff. Ghezzi, Lanzi, Matera e Morzenti Seconda prova in itinere 4 Luglio 2005 COGNOME E NOME (IN STAMPATELLO) MATRICOLA Risolvere
Cicli. S i a i = a 1 + a 2 + a a n
Cicli Esprimono in modo compatto e generali l'esecuzione di uno stesso blocco di codice per più volte Anche in matematica sono presenti operatori che eseguono di fatto un ciclo (ad es. sommatoria e produttoria)
