Fondamenti di Informatica C Lezione 14: Algoritmi fondamentali

Fondamenti di Informatica C
Lezione 14:
Algoritmi fondamentali
5-11-2007
Selection sort: l’algoritmo più stupido
ÖCercare l’elemento più piccolo
ÖMetterlo al primo posto
ÖCercare l’elemento più piccolo fra quelli rimasti
ÖMetterlo al secondo posto
ÖCercare l’elemento più piccolo fra quelli rimasti
ÖMetterlo al terzo posto
ÖCercare l’elemento più piccolo fra quelli rimasti
ÖMetterlo al quarto posto
Ö…
Lezione 14: Algoritmi fondamentali
5-11-2007
2
Selection Sort
void selection_sort (int a[ ], int N)
{
int i, j, min, t;
for (i=1; i<N; i++)
{
min=i;
for ( j=i+1; j<=N; j++)
if (a[j]<a[min] ) min=j;
t=a[min]; a[min]=a[i]; a[i]=t;
}
}
Selection_sort
Lezione 14: Algoritmi fondamentali
5-11-2007
3
Insertion Sort
void insertion_sort (int a[ ],int N)
{
int i,j,v;
a[0] = INT_MIN;
for (i=2; i<=N; i++)
{
v=a[i]; j=i;
while ( a[j-1]>v)
{ a[j]=a[j-1]; j--; }
a[j]=v;
}
}
Insertion_sort
Lezione 14: Algoritmi fondamentali
5-11-2007
4
Bubble Sort
void bubble_sort (int a[],int N)
{
int i, j, t;
for (i=N; i>=1; i--)
for (j=2; j<=i; j++)
if ( a[j-1]>a[j] )
{
t=a[j-1];
a[j-1]=a[j]; a[j]=t;
}
}
Bubble_sort
Lezione 14: Algoritmi fondamentali
5-11-2007
5
Quicksort
1. Prendere un elemento a caso (ad esempio l’ultimo a
destra) elemento pivot
2. Mettere tutti gli elementi minori alla sua sinistra
e tutti quelli maggiori alla sua destra
ƒ
A questo punto l’elemento in questione è al posto giusto
3. Ripetere sugli elementi alla sua sinistra
4. Ripetere sugli elementi alla sua destra
quick_sort
Lezione 14: Algoritmi fondamentali
5-11-2007
6
Per capire gli algoritmi di ordinamento
ÖMolti siti sull’internet
z
z
http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html
http://www-ihm.lri.fr/~thomas/VisuTri/
Lezione 14: Algoritmi fondamentali
5-11-2007
7
Alcune altre considerazioni sugli
algoritmi
ÖPer qualunque problema computabile esistono infiniti
algoritmi risolutivi
ÖNoi non studiamo la complessità computazionale dei
nostri algoritmi
ÖPerò io cerco di darvi un’idea qualitativa del loro costo
ÖIl costo può essere valutato in relazione a diversi
parametri, ad es.
z
z
Tempo di calcolo occorrente
Occupazione di memoria
ÖOttimizzare rispetto a un parametro in genere significa
spendere rispetto ad un altro
Lezione 14: Algoritmi fondamentali
5-11-2007
8
Ad esempio:
ÖInsertion sort usa la minima quantità di memoria
indispensabile, ma è lento
ÖQuicksort è veloce, ma usa molta più memoria. Perché?
z
Perché, essendo ricorsivo, occorre creare molte istanze della
funzione. Se le cose non sono fatte bene può addirittura
“esplodere” e richiedere una profondità di ricorsione pari al
numero di elementi del vettore.
Lezione 14: Algoritmi fondamentali
5-11-2007
9
Considerazioni generali sugli algoritmi
ÖBubble sort
effettua all’incirca N2/2 confronti ed N2/2 scambi,
sia in media che nel caso peggiore
Ö Selection sort
effettua all’incirca N2/2 confronti ed N scambi
per ogni i da 1 a N -1 c’è uno scambio ed N-1
confronti per un totale di N-1 scambi e (N-1)+(N-2)
+…+2+1=N(N-1)/2 indipendentemente dai dati in
ingresso. L’aggiornamento della variabile min
dipende dai dati in ingresso nel caso peggiore il
numero è quadratico, mediamente Nlog2N
Lezione 14: Algoritmi fondamentali
5-11-2007
10
Considerazioni generali sugli algoritmi
Ö Insertion sort
effettua in media N2/4 confronti ed N2/4 spostamenti, il
doppio nel caso peggiore, lineare nel caso di vettore quasi
ordinato
Ö Quick sort
effettua in media 2Nlog2N confronti ed Nlog2N scambi,
esegue N2/2 confronti nel caso peggiore, con sempre circa
Nlog2N scambi
(se si esegue l’algoritmo su un vettore di N elementi già
ordinato, l’algoritmo richiamerà se stesso N volte con vettori
di dimensioni decrescenti di un’unità)
Lezione 14: Algoritmi fondamentali
5-11-2007
11