Definizione di algoritmo: Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile.

Slides:



Advertisements
Presentazioni simili
Gli Algoritmi di ordinamento
Advertisements

INFORMATICA Algoritmi fondamentali
1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.
                      Insertion-Sort
Sottoprogrammi: funzioni e procedure
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.
Algoritmi notevoli In linguaggio C.
Procedure e funzioni ricorsive
Breve panoramica sulle librerie standard: assert.h, stdio.h
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Algoritmi in C++ (1) da completare
PROGRAMMI DI RICERCA E ORDINAMENTO
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Corso di Informatica grafica 1 Introduzione Quando si rappresentano modelli di oggetti 3D costituiti da facce poligonali secondo delle proiezioni alcune.
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Ordinamento di una lista: bubble-sort
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Progetto di algoritmi: metodologia "Divide et Impera"
Algoritmi di ordinamento
APPUNTI SUL LINGUAGGIO C
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
Le liste dinamiche La ricorsione
AN Fondam98 Sorting Ricerca in un vettore ordinato.
Crivello Di Eratostene (fonte wikipedia
Algoritmi e Strutture Dati 8 crediti Calendario: 1 Ott. – 6 Dic. Aula: LuM250 Orario: Lun, Mar, Mer, Gio Giorni di lezione disponibili 40 ~48.
Elementi di Informatica di base
Sistemi e Tecnologie Informatiche
Ordinamento dell’array
Problema dell’ordinamento di un array: Il metodo Bubble Sort.
Diagramma di flusso del problema del Supermercato.
void binario(int n); …………………
Massimo Comun Divisore
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
28 ottobre Mergesort F. Bombi 28 ottobre 2003.
Ripasso : Algoritmi.
Ricerca sequenziale in un array di interi
Complessità di un algoritmo
Algoritmo che viene utilizzato per elencare gli elementi di un insieme secondo una sequenza stabilita da una relazione d'ordine, in modo che ogni elemento.
Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo.
Algoritmi di Ordinamento
Algoritmi CHE COS’è UN ALGORITMO di ORDINAMENTO?
A LGORITMI DI ORDINAMENTO Cinzia Reverberi. COS’È UN ALGORITMO? Un algoritmo è un insieme ben ordinato di operazioni non ambigue ed effettivamente calcolabili.
Definizione di un algoritmo
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
Complessità degli algoritmi (cenni) CORDA – Informatica A. Ferrari.
Array (ordinamento) CORDA – Informatica A. Ferrari.
Programmazione Avanzata Java e C 12/01/ Lezione 28: Algoritmi di ordinamento.
Complessità del problema Se non facciamo ipotesi sul tipo degli elementi della sequenza le uniche operazioni permesse sono confronti e assegnazioni. Problema.
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Algoritmi e Strutture Dati Laurea in Informatica Calendario: 2 Marzo – 12 Giugno Aula: LuM250 Orario: Mer, Gio, Ven Numero crediti = 8 (~ 64.
Ordinamento1 Algoritmi di ordinamento  Selection Sort  Quick Sort  Lower bound alla complessità degli algoritmi di ordinamento.
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
Introduzione agli algoritmi e strutture dati 2/ed T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein Copyright © 2005 – The McGraw-Hill Companies srl.
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II
Array (visita e ricerca) CORDA – Informatica A. Ferrari.
Quick sort void quick_sort (int a[],int l, int r) { int i, j,v, t; if (r>l) { v=a[r];//L’elemento “pivot” è quello più a dx i=l-1; j=r; // i scorre da.
L’ALGORITMO Un algoritmo è un procedimento formale che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Esercizi sugli array e strutture
Dalla programmazione tradizionale al paradigma OO
Transcript della presentazione:

Definizione di algoritmo: Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo si dice computabile Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo si dice computabile.

Tutti i tipi di algoritmo

Selection Sort: void selsort(int x[ ], int y) { int z=0; for (z=0;z<n;z++) { int y=0; for (y=z+1;y<n;y++) { if (x[y] < x[y]) { int t=x[y]; x[y]=x[z]; x[z]=t; } alla prima iterazione verrà selezionato l’elemento più piccolo dell’intero insieme e sarà scambiato con quello che occupa la prima posizione. Alla seconda iterazione è selezionato il secondo elemento più piccolo dell’insieme è viene scambiato con l’elemento che occupa la seconda posizione. Si ripete fino ad aver collocato nella posizione corretta tutti gli n elementi.

Inserction Sort: void inssort(int a[ ],int n) { int i=0,j=0; for (i=1;i<n;i++) { int x=a[i], s=1, d=i-1; while (s<=d) { int m=(s+d)/2; if (x<a[m]) d=m-1; else s=m+1; } for (j=i-1,j>=s;j--) a[j+1]=a[j]; a[s]=x; } Ad ogni iterazione, il vettore è costituito da una parte iniziale ordinata e da la parte rimanente che contiene i valori da ordinare. Per ogni valore ancora da inserire, viene fatta una ricerca binaria nella parte ordinata del vettore e vengono spostati in avanti tutti gli elementi per liberare una posizione Nella posizione liberata viene inserito il valore.

Bubble Sort: void bubbsort(int x[ ], int y) { bool scambio=true; int ultimo=y-1,i=0; while (scambio) { scambio=false; for (i=0;i<ultimo;i++) { if ( x[i]> x[i+1]) { int t= x[i]; x[i]=x[i+1]; x[i+1]=t; scambio=true; } ultimo --; } L’algoritmo BUBBLE SORT (ordinamento a bolle) so basa sull’idea di far emergere pian piano gli elementi più piccoli verso l’inizio dell’insieme da ordinare facendo sprofondare gli elementi maggiori verso il fondo: un po’ come le bollicine in un bicchiere di acqua gassata da qui il nome di ordinamento a bolle.

Quick Sort: void sort(int a[ ], int inizio, int fine) { int x, y, z; if (fine >inizio) { x = a [inizio]; y= inizio + 1; z= fine+1; while (y < z) { if (a [y] < x) y++; else { r--; swap(a[y], a[z]); } void swap(int & x, int & y) { int temp=x; x=y; y=temp; } Assunto un elemento come perno, si confrontano con esso gli altri elementi e si posizionano alla sua sinistra i minori e a destra i maggiori, senza tener conto del loro ordine. Dopo questo stadio si ha che il perno è nella sua posizione definitiva. Successivamente si procede in modo ricorsivo all'ordinamento parziale delle sottosequenze di elementi rimasti non ordinati, fino al loro esaurimento.

Merge Sort: void mersort (int x[ ], int sinistra, int centro, int destra) int i = sinistra, j=centro+ 1,k=0; int y[ ]; while ((i <= centro) && (j <= destra)) { if (x[i] <= x[j]){ y[k]=a[i]; i=i + 1; } else { y[k] = x[j]; j=j + 1; } k=k + 1; } for (k =left ;k<right;k++) { a[k] = b[k - left]; } L'insieme di elementi viene diviso in 2 metà. Se l'insieme è composto da un numero dispari di elementi, viene diviso in 2 sottogruppi dei quali il primo ha un elemento in meno del secondo. Supponendo di avere due sequenze già ordinate. Per unirle, mergesort estrae ripetutamente il minimo delle due sequenze in ingresso e lo pone in una sequenza in uscita. void mergesort (int[] a, int left, int right) { int center; if (left < right) { center = (left + right) / 2; mergesort(a, left, center); mergesort(a, center+1, right); merge(a, left, center, right); }

void HeapSort(int a[ ], int n){ int i; int lh = n; Costruisci_Heap(a, n); for(i = n-1; i > 0; i--){ temp = a[i]; a[i] = a[0]; a[0] = temp; lh--; Rendi_Heap(a, n, lh, 0); } } void 2_Heap(t_id_tab a[], int n){ int i; for(i = n/2 - 1; i >= 0; i--) 1 Heap(a, n, lh, i); Heap Sort: void 1_Heap(t_id_tab a[], int n, int lh, int i){ int s, d, max; s = 2*i + 1; d = 2*i + 2; if ((s a[i])) max = s; Else max = i; if ((d a[max].chiave)) max = d; if (max != i){ temp = a[i]; a[i] = a[max]; a[max] = temp; 1_Heap(a, n, lh, max);

Counting Sort: Per ogni elemento x dell'insieme da ordinare si determinano quanti elementi sono minori di x, si usa questa informazione per assegnare ad x la sua posizione finale nel vettore ordinato. Se, ad esempio, vi sono 8 elementi minori di x, allora x andrà messo nella posizione 9 bisogna fare attenzione al caso in cui vi siano elementi coincidenti. In questo caso infatti non vogliamo assegnare a tutti la stessa posizione. void counting_sort(int* A, int Alen, int* B, int k){ int i; int C[k]; for(i=0; i<k; i++) C[i] = 0; int j; for(j=0; j<Alen; j++) C[A[j]] = C[A[j]]+1; for(i=1; i<k; i++) C[i] = C[i]+C[i-1]; for (j=Alen-1; j>=0; j--){ B[C[A[j]]-1] = A[j]; C[A[j]] = C[A[j]]-1; }

Bucket Sort: Bucket sort suppone che l’input sia generato da un processo casuale che distribuisce gli elementi uniformemente nell’intervallo [0, 1[. Il concetto che sta alla base dell’algoritmo è quello di dividere l’intervallo [0, 1[ in n sottointervalli della stessa dimensione, detti bucket, nei quali vengono distribuiti gli n valori di input. A questo scopo lo pseudocodice che definisce l’algoritmo suppone che l’input sia un array A di n elementi e richiede un array ausiliario B[0...n−1] di liste concatenate (bucket). L’algoritmo procede semplicemente ordinando i valori in ogni bucket tramite un ordinamento di tipo insertion sort. L’output viene infine prodotto concatenando in ordine i vari bucket in un array. #include void bucketSort(int array[ ], int n) { int i, j; int count[n]; for(i=0; i 0; (count[i])--) { array[j++] = i; }}} int main() { int array[] = {1,3,4,6,4,2,9,1,2,9}; int n = 10; int i; for (i = 0;i < n;i++) { printf("%d ", array[i]); } printf("\n"); bucketSort(array, n); for (i = 0;i < n;i++) { printf("%d ", array[i]); } printf("\n"); return 0;