Ordinamento dei vettori (SELECTION-SORT) Ordinamento per selezione (selection- sort) Si cerca l’elemento più piccolo e si scambia con l’elemento in posizione.

Slides:



Advertisements
Presentazioni simili
1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Advertisements

Gli Algoritmi di ordinamento
INFORMATICA Algoritmi fondamentali
Uso avanzato di C.
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Unità G3 Algoritmi notevoli. Ordinamento Un insieme di dati {a0, a1, a2, …, an} si dice ordinato in ordine crescente se a0 a1 a2 a3 … an I dati sono generalmente.
Algoritmi notevoli.
Tipi di dato astratti Lista, Pila, Coda, Albero.
Algoritmi notevoli In linguaggio C.
Strutture dati lineari
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Strutture dati elementari
Algoritmi in C++ (1) da completare
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
PROGRAMMI DI RICERCA E ORDINAMENTO
Esercizi su alberi binari
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
1 Il nostro esempio guida: La costruzione di uno stack.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
1 Corso di Informatica (Programmazione) Esercitazione 2 (3 dicembre 2008)
CORSO DI PROGRAMMAZIONE II
e array a più dimensioni
Ordinamento di una lista: bubble-sort
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Esercizi C su array e matrici
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Fibonacci Heaps e il loro utilizzo nell’algoritmo di Prim
Problema dell’ordinamento di un array: Il metodo Bubble Sort.
Corso di informatica Athena – Periti Informatici
void binario(int n); …………………
Programmazione di Calcolatori
Esercizi Liste.
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
Array (ordinamento) CORDA – Informatica A. Ferrari.
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Pile e Code.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Algoritmi e Strutture Dati Strutture Dati Elementari.
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
1. 2 Ricordiamo che: La pila o stack è una struttura astratta composta da più elementi omogenei. Una pila è uno stack di dati con accessi del tipo LIFO.
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
L’ordinamento per Selezione seleziona l’elemento con valore maggiore e lo scambia con il primo elemento del vettore. Tra gli N-1 elementi rimanenti viene.
Complessità Computazionale
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
GLI ALGORITMI DI ORDINAMENTO
L’ALGORITMO Un algoritmo è un procedimento formale che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
6/11/01Ordinamento 1 Un esempio di algoritmi: ordinamento.
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE ABACUS Ud1Strutture dati lineariTempi -Liste semplicemente puntate 3h+3h.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
10. Programmazione Ricorsiva Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Ricerca 01/08/2019 package.
Transcript della presentazione:

Ordinamento dei vettori (SELECTION-SORT) Ordinamento per selezione (selection- sort) Si cerca l’elemento più piccolo e si scambia con l’elemento in posizione i=0  Si cerca l’elemento più piccolo tra i rimanenti N-i e si scambia con l’elemento in posizione i, per i=1..N-1 

Ordinamento dei vettori (SELECTION SORT) #include void scambia(int vettore[], int x, int y) { int lavoro = vettore[x]; vettore[x] = vettore[y]; vettore[y] = lavoro; } // selection sort void selectionSort(int vettore[], int n) { int min; for (int i = 0 ; i < n-1; i++) { min=i; for (int j = i+1; j < n; j++) if (vettore[j] < vettore[min]) min=j; scambia(vettore,i,min); } Complessità dell’algoritmo dell’ordine di n 2, dove n è il numero di elementi nel vettore.

Ordinamento dei vettori (BUBBLE-SORT) Si scorre l’array n-1 volte, dove n è il numero di elementi nell’array, da destra a sinistra, scambiando due elementi contigui se non sono nell’ordine giusto.  Prima volta  Seconda volta N.B.: i primi due elementi risultano ordinati

Ordinamento dei vettori – BUBBLE-SORT  Terza volta  Quarta volta Quinta volta Nessun cambiamento ALGORITMO void bubble(int vettore[], int n) { for (int i = 0 ; i < n-1; i++) for (int j = n-1; j >= i+1; j--) if(vettore[j] < vettore[j-1]) scambia(vettore,j,j-1); } N.B.: i primi tre elementi risultano ordinati N.B.: i primi quattro elementi risultano ordinati

BUBBLE-SORT ottimizzato (1) Supponiamo che il vettore iniziale sia //ALGORITMO BUBBLE-SORT OTTIMIZZATO void bubble(int vettore[], int n) { bool ordinato=false; for (int i = 0 ; i < n-1 && !ordinato; i++) { ordinato=true; for (int j = n-1; j >= i+1; j--) if(vettore[j] < vettore[j-1]) { scambia(vettore,j,j-1); ordinato=false; }  Prima volta  Già dopo il primo passo il vettore risulta ordinato.

BUBBLE-SORT ottimizzato (2) L’algoritmo può essere risolto in maniera più efficiente effettuando i confronti non fra elementi adiacenti, ma fra elementi che distano un certo passo.  Passo=n/2;  Passo=n/4; 

BUBBLE-SORT ottimizzato (2) //ALGORITMO BUBBLE-SORT OTTIMIZZATO void bubble(int vettore[], int n) { bool ordinato; int passo=n, t; while (passo>1) { passo/=2; ordinato=false; while (!ordinato) { ordinato=true; for (int j = n-1; j >= passo; j--) if(vettore[j] < vettore[j-passo]) { scambia(vettore,j,j-passo); ordinato=false; }

Ricerca lineare Ricerca lineare dell’elemento che contiene 4 tra l’elemento in posizione infe e quella in posizione supe. scansione del vettore dall’elemento in posizione infe all’elemento in posizione supe. bool ricerca(int vett[], int infe, int supe, int k, int* pos) { bool trovato = false; while ((!trovato) && (infe <= supe)) { if(vett[infe] == k) { *pos = infe; trovato = true; } infe++; } return trovato; } N.B. Complessita’ lineare  infesupe  infesupe  infesupe

Ricerca binaria Pre-requisito: Vettori ordinati Ricerca binaria (vettori ordinati in ordine crescente) Idea: Si confronta la data entità k (chiave) con l’elemento di centro del vettore; se sono uguali la ricerca termina; altrimenti, –se la chiave è minore dell’elemento la ricerca prosegue nella prima metà del vettore; –se la chiave è maggiore dell’elemento la ricerca prosegue nella seconda metà del vettore. bool ricbin(int ordVett[], int infe, int supe, int k, int* pos) { while (infe <= supe) { int medio = (infe + supe) / 2; //calcola il punto medio if (k > ordVett[medio]) infe = medio + 1; //ripete la ricerca nella meta' superiore else if (k < ordVett[medio]) supe = medio - 1; //ripete la ricerca nella meta' inferiore. else { *pos=medio; // trovato: restituisce la posizione return true; } return false; } N.B. Complessita’ logaritmica

Pila Insieme ordinato di dati di tipo uguale, in cui è possibile effettuare operazioni di inserimento e di estrazione secondo la seguente regola di accesso: l’ultimo dato inserito è il primo ad essere estratto (LIFO: Last In First Out). Se top==-1, la pila è vuota. Se top==SIZE-1, dove SIZE è il numero massimo di elementi nella pila, la pila è piena. //pila.cpp #include const int SIZE=5; struct pila { int top; int stack[SIZE]; }; //inizializzazione della pila void inip(pila* pp) { pp->top=-1; } //pila vuota? bool empty(const pila* pp) { if (pp->top==-1) return true; return false; } top

Pila //pila piena? bool full(const pila* pp) { if (pp->top==SIZE-1) return true; return false; } //inserisci un elemento in pila bool push(pila* pp, int s) { if (pp->top==SIZE-1) return false; pp->stack[++(pp->top)]=s; return true; } //estrae un elemento dalla pila bool pop(pila* pp, int* s) { if (pp->top==-1) return false; *s=pp->stack[(pp->top)--]; return true; } void stampa(const pila* pp) { cout << "Elementi contenuti nella pila: " << endl; for (int i=pp->top; i>=0; i--) cout stack[i]<<endl; }

Esempio Pila void main() { pila st; inip(&st); int num; if (empty(&st)) cout << "Pila vuota" << endl; for (int i=0; i<SIZE;i++) if (push(&st,i)) cout << "Inserito l'elemento " << i << " in posizione " << st.top << endl; else cerr << "Pila piena"<<endl; if (full(&st)) cout << "Pila piena" << endl; stampa(&st); for (int i=0; i<SIZE-2; i++) if (pop(&st,&num)) cout <<"Estratto l'elemento " << num << " in posizione " << st.top+1 << endl; else cout << "Pila vuota"<<endl; for (int i=0; i<SIZE;i++) if (push(&st,i)) cout << "Inserito l'elemento " << i << " in posizione " << st.top << endl; else cerr << "Pila piena"<<endl; stampa(&st); for (int i=0; i<2; i++) if (pop(&st,&num)) cout <<"Estratto l'elemento " << num << " in posizione " << st.top+1 << endl; else cout << "Pila vuota"<<endl; stampa(&st); system("PAUSE"); }

Esempio Pila Pila vuota Inserito l'elemento 0 in posizione 0 Inserito l'elemento 1 in posizione 1 Inserito l'elemento 2 in posizione 2 Inserito l'elemento 3 in posizione 3 Inserito l'elemento 4 in posizione 4 Pila piena Elementi contenuti nella pila: Estratto l'elemento 4 in posizione 4 Estratto l'elemento 3 in posizione 3 Estratto l'elemento 2 in posizione 2 Inserito l'elemento 0 in posizione 2 Inserito l'elemento 1 in posizione 3 Inserito l'elemento 2 in posizione 4 Pila piena Elementi contenuti nella pila: Estratto l'elemento 2 in posizione 4 Estratto l'elemento 1 in posizione 3 Elementi contenuti nella pila: 0 1 0

Coda Insieme ordinato di dati di tipo uguale, in cui è possibile effettuare operazioni di inserimento e di estrazione secondo la seguente regola di accesso: il primo dato inserito è il primo ad essere estratto (FIFO: First In First Out). Realizzata con un array circolare e due puntatori: –front – posizione da cui avviene l’estrazione; –back – posizione in cui avviene l’inserimento. front==back coda vuota front==(back+1)%SIZE coda piena –(ATTENZIONE al massimo SIZE-1 elementi backfront backfront backfront Inserimento di un elemento Non sarebbe possibile discriminare tra coda vuota e coda piena back

Coda //coda.cpp #include const int SIZE=5; struct coda { int front, back; int queue[SIZE]; }; //inizializzazione della coda void inic(coda* cc) { cc->front=cc->back=0; } //coda vuota? bool empty(const coda* cc) { if (cc->front==cc->back) return true; return false; } //coda piena? bool full(const coda* cc) { if (cc->front==(cc->back+1)%SIZE) return true; return false; }

Coda //inserisci un elemento in coda bool insqueue(coda* cc, int s) { if (cc->front ==(cc->back+1)%SIZE) return false; cc->queue[cc->back]=s; cc->back=(cc->back+1)%SIZE; return true; } //estrae un elemento dalla coda bool esqueue(coda* cc, int* s) { if (cc->front ==cc->back) return false; *s=cc->queue[cc->front]; cc->front= (cc->front + 1)%SIZE; return true; } void stampa(const coda* cc) { for (int i=cc->front; i%SIZE!=cc->back;i++) cout queue[i%SIZE] << endl; }

Esempio Coda void main() { coda qu; int num; inic(&qu); if (empty(&qu)) cout << "Coda vuota" << endl; for (int i=0; i<SIZE;i++) if (insqueue(&qu,i)) cout << "Inserito l'elemento " << i << " in posizione " << (qu.back+SIZE-1)%SIZE << endl; else cerr << "Coda piena"<<endl; if (full(&qu)) cout << "Coda piena" << endl; stampa(&qu); for (int i=0; i<SIZE-2; i++) if (esqueue(&qu,&num)) cout <<"Estratto l'elemento " << num << " in posizione " << (qu.front+SIZE-1)%SIZE << endl; else cout << "Coda vuota"<<endl; for (int i=0; i<SIZE;i++) if (insqueue(&qu,i)) cout << "Inserito l'elemento " << i << " in posizione " << (qu.back+SIZE-1)%SIZE << endl; else cerr << "Coda piena"<<endl; stampa(&qu); for (int i=0; i<2; i++) if (esqueue(&qu,&num)) cout <<"Estratto l'elemento " << num << " in posizione " << (qu.front+SIZE-1)%SIZE << endl; else cout << "Coda vuota"<<endl; stampa(&qu); system("PAUSE"); }

Esempio Coda Coda vuota Inserito l'elemento 0 in posizione 0 Inserito l'elemento 1 in posizione 1 Inserito l'elemento 2 in posizione 2 Inserito l'elemento 3 in posizione 3 Coda piena Elementi contenuti nella coda: Estratto l'elemento 0 in posizione 0 Estratto l'elemento 1 in posizione 1 Estratto l'elemento 2 in posizione 2 Inserito l'elemento 0 in posizione 4 Inserito l'elemento 1 in posizione 0 Inserito l'elemento 2 in posizione 1 Coda piena Elementi contenuti nella coda: Estratto l'elemento 3 in posizione 3 Estratto l'elemento 0 in posizione 4 Elementi contenuti nella coda: 1 2 Premere un tasto per continuare...