Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
http://de253.poliba.it/mailman/
listinfo/fondamenti-di-
informatica-cdl-elettronica-
telecomunicazioni
2
Algoritmi
• Definizione
• Caratteristiche
• Pianificazione e progettazione
• Rappresentazione
• Operazioni fondamentali
• Teorema di Jacopini-Böhm
• Diagrammi di flusso
3
Definizione
• Intuitiva
Sequenza ordinata di istruzioni per risolvere un problema.
(Es. ricetta)
• Formale
Insieme ordinato di operazioni non ambigue,
effettivamente eseguibili che risolvono, in un tempo
finito, tutti i problemi di una determinata classe.
4
Caratteristiche degli algoritmi
• Carattere deterministico (.. Insieme ordinato di
istruzioni non ambigue ..)
5
insieme ordinato … non ambigue
Shampoo Torta
• Bagna i capelli •Prepara base
• Insapona
• Risciacqua - setaccia farina
• Ripeti (cosa?, - aggiungi uova, acqua…
quante volte?) •prendi setaccio
6
Caratteristiche degli algoritmi
• Carattere di realizzabilità pratica (..effettivamente
eseguibili ..)
tutte le istruzioni che costituiscono l’algoritmo devono
essere effettivamente eseguibili
(Es. calcolare l’esatto valore decimale di π. Calcola tutti i
numeri primi e stampa il primo maggiore di 100)
7
Caratteristiche degli algoritmi
• Carattere finito (.. risolvono in un tempo finito …)
8
Carattere finito
Shampoo
1) Bagna i capelli
2) Contatore = 0
3) Ripeti passi da 4 a 6 finché contatore =2
4) Insapona i capelli
5) Risciacqua
6) Contatore = Contatore + 1
7) stop
9
Algoritmo per sommare due
numeri
c=a+b con a e b numeri formati da m cifre
cm cm-1cm-2.. c0 = am-1 am-2 ..a0 + bm-1 bm-2 ..b0
1. riporto = 0
2. i = 0
3. ripeti passi 4 – 6 finché i diventa > m -1
4. somma ai e bi al riporto per ottenere ci
10
Algoritmo per sommare due
numeri
5. se ci ≥ 10 ci = ci -10 e riporto = 1, altrimenti riporto = 0
6. i = i + 1
7. cm = riporto
8. stampa risultato
9. stop
11
Pianificazione e progettazione
• Analizzare il problema
•comprendere a fondo il problema e darne una
definizione precisa
•quali sono gli input?
•quali sono i dati? I formati?
•quali devono essere gli output?
•come elaborare i dati?
12
Pianificazione e progettazione
• Progettare una soluzione
Definire i passi da applicare per risolvere il
problema
Passi dettagliati, non ambigui e finiti
Verifica della soluzione
• Codificare il programma e documentarlo
• Testare il programma
Singole parti del codice (moduli)
13
Pianificazione e progettazione
• Validare il programma
Serie estesa di prove
Input non validi
Valutazioni sull’interfaccia utente (sono
sufficienti le indicazioni fornite?)
14
Esempio
Determinare in un gruppo di persone la percentuale di
presenze divisa nei seguenti gruppi di età:
0-5
6-12
13-19
20-64
> 65
15
Analizzare il problema
Input età di ogni persona presente
16
Progettare una soluzione
1) Richiedere l’età della persona
2) Aggiungerla al gruppo corrispondente
3) Ripeti per tutte le persone i passi 1-2
4) Calcola la percentuale per ogni gruppo
4.1) Determina il numero totale di persone
4.2) Dividi i totali parziali per il totale globale
5) Output risultato
17
Esercizi
• Modificare l’algoritmo della somma in modo che non stampi
gli zero non significativi
• Eseguire la moltiplicazione mediante l’addizione ripetuta
• Eseguire la divisione mediante la sottrazione ripetuta
18
Caratteristiche di un
calcolatore elettronico
• È velocissimo
Non è intelligente
Non è in grado di compiere deduzioni o
ragionamenti in modo autonomo.
• Non è in grado di capire un problema.
• Non è in grado di capire se il risultato
raggiunto è la soluzione del problema.
Capacità del calcolatore
• Sa leggere le informazioni dall’esterno (input).
Sa memorizzare le informazioni.
Sa eseguire alcune operazioni elementari: addizione,
sottrazione, prodotto e rapporto fra numeri,
concatenazione di parole.
Sa eseguire il confronto fra informazioni dello stesso
tipo: (es.: a>b, a=b, a≤b e l’uguaglianza fra due parole).
27
Algoritmo
Esempio: Ordinamento di un mazzo di carte
Sia dato un mazzo da 40 carte da ordinare in modo che
i cuori precedano i quadri, che a loro volta precedono
fiori e picche; le carte di uno stesso seme sono ordinate
dall’asso al re
Algoritmo:
• Si suddivida il mazzo in 4 mazzetti, ciascuno costituito
da tutte le carte dello stesso seme
• Si ordinino le carte di ciascun mazzetto dall’asso al re
• Si prendano nell’ordine i mazzetti delle cuori, quadri,
fiori e picche
28
Algoritmo
Si vuole ricercare, all’interno di un mazzo di chiavi,
quella che apre un dato lucchetto
Algoritmo:
1) Si seleziona una chiave dal mazzo e la si marca con un
pennarello
2) Si tenta di aprire il lucchetto con la chiave appena
marcata; se funziona, si va al passo 4)
3) Altrimenti, si controlla la chiave successiva
3.1) Se non è marcata, la si marca e si torna al passo 2)
3.2) Viceversa, si prende atto che nel mazzo non è
presente la chiave che apre il lucchetto
4) Fine della ricerca
29
Algoritmo
Somma di un insieme di numeri
Dati da elaborare: un insieme di numeri (che sarà noto
solo nel momento in cui l’algoritmo verrà eseguito).
Risultato desiderato: la loro somma.
30
Algoritmo
Esempio: calcolare la somma dei numeri 5, −7, 4, 9, −2. Somma iniziale: 0
31
Problemi e istanze
Un’istanza di un problema corrisponde a un
particolare valore dei suoi dati d’ingresso.
33
Algoritmo
es. Calcolare il M.C.D. di due interi a,b, con a>b
1) Acquisire i valori di a e b
2) Se b>a, scambiare i valori di a e b
3) Calcolare il resto r della divisione intera di a per b
4) Se r=0, MCD(a,b)=b; comunicare il risultato
all’esterno; eseguire l’istruzione 6)
5) Se r≠0, sostituire il valore di a con il valore di b ed
il valore di b con il valore di r; tornare al passo 3)
6) Fine
35
Algoritmo: costanti e variabili
I dati su cui opera un algoritmo sono costanti e
variabili
• Un dato è costante quando il suo valore non può
essere aggiornato durante l’esecuzione
dell’algoritmo o per esecuzioni successive
• Una variabile è una coppia <nome, valore>: può
essere immaginata come una scatola sulla
quale è scritto un nome e che può contenere un
valore
36
Algoritmo: costanti e variabili
Il valore di una variabile deve appartenere
all’insieme di definizione, su cui si opera
mediante regole opportune specifiche dell’insieme
Data una variabile <x,v>, x è il nome della variabile
e v è il suo valore attuale; le variabili sono
indeterminate in fase di definizione dell’algoritmo,
ma corrispondono a valori specifici durante ogni
esecuzione
Esempio: Nell’algoritmo di risoluzione delle
equazioni di 2° grado, a, b, c non corrispondono a
nessun valore finché non si esegue l’algoritmo
37
Assegnazione
L’istruzione di assegnazione definisce il valore attuale di
una variabile, che resta inalterato fino all’assegnazione
successiva
L’assegnazione si rappresenta con i simboli “←” o “=“:
nome di variabile ← espressione
nome di variabile = espressione
che si legge assegna alla variabile “nome di variabile” il
valore di “espressione”; l’espressione a destra di ← è
costituita da variabili, costanti e operatori
L’assegnazione viene così eseguita:
a) si valuta l’espressione a destra di ←, sostituendo ai nomi
di variabile i loro valori attuali; il risultato deve
appartenere all’insieme di definizione della variabile a
sinistra di ← | = 38
Assegnazione
I nomi delle variabili possono essere scelti in modo
arbitrario, ma è opportuno selezionare nomi
significativi del contenuto della variabile
39
Istruzioni
Istruzioni operative, che producono risultati
Istruzioni di controllo, che controllano il verificarsi di condizioni
specificate e, in base al risultato del controllo, determinano il flusso di
istruzioni da eseguire
Istruzioni di salto, che alterano il normale flusso di esecuzione
sequenziale delle istruzioni di un algoritmo, specificando quale sia la
successiva istruzione da eseguire
• nelle istruzioni di salto condizionato, l’effettiva esecuzione del salto è
legata al verificarsi di una condizione specificata
• l’istruzione di salto incondizionato produce sempre un salto
Istruzioni di Input/Output, che specificano come debba essere effettuata
una trasmissione di dati o messaggi fra l’algoritmo e l’ambiente esterno
Istruzioni di inizio/fine esecuzione, che indicano l’inizio/la fine
dell’algoritmo
40
Algoritmo
Problema: Calcolo delle radici reali di ax2+bx+c=0
Algoritmo:
1) Input coefficienti a,b,c
2) Calcolare ∆ = b2−4ac
5) x1=(−b+√∆)/2a, x2=(−b−√∆)/2a
= (uguale) ≠ (diverso)
> (maggiore) < (minore)
≥ (maggiore o uguale) ≤ (minore o uguale)
44
Proposizioni e predicati
Dato un predicato p, il predicato not p, detto opposto o
negazione logica di p, ha i valori di verità opposti rispetto a p;
Dati due predicati p e q, la congiunzione logica p and q è un
predicato vero solo quando p e q sono entrambi veri, e falso
in tutti gli altri casi
Dati due predicati p e q, la disgiunzione logica p or q è un
predicato falso solo quando p e q sono entrambi falsi, e vero
in tutti gli altri casi
I predicati nei quali compare almeno un operatore logico,
not, and, or, sono detti composti
La tavola di verità di un predicato composto specifica il valore
del predicato per ognuna delle possibili combinazioni dei suoi
argomenti
45
Predicati composti
47
Rappresentazione degli algoritmi
2. Linguaggio di programmazione formale
quando si progetta un algoritmo si parte da livello elevato
di astrazione, senza doversi concentrare sulla
punteggiatura, sulla grammatica e sintassi.
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
const int NEM = 10;
int v[NEM];
int ne;
cout << "Numero elementi vettore? (max " << NEM << "): ";
cin >> ne;
for(int i=0; i<ne; i++) v[i] = rand()%101; // max 100
cout << "Il vettore e':" << endl;
for(int i=0; i<ne; i++) cout << v[i] << " ";
cout << endl;
float min = v[0];
for(int i=0; i<ne; i++) if(v[i] < min) min = v[i];
cout << "Il minimo vale: " << min << endl;
}
48
Rappresentazione degli algoritmi
3. Pseudocodice
linguaggio di programmazione senza regole
grammaticali,
facilmente leggibile.
49
Rappresentazione degli algoritmi
4. Diagrammi di flusso (flow chart)
Rappresentazione in forma schematica della
logica e della struttura dell’algoritmo.
Ad ogni istruzione corrisponde un simbolo grafico
la cui forma dipende dal tipo di istruzione
considerata.
Efficace mezzo di comunicazione tra i
programmatori e chi e’ coinvolto nell’uso del
programma
50
Operazioni fondamentali
Operazioni sequenziali descrivono un singolo compito ben
definito
51
Operazioni fondamentali
Operazioni condizionali consentono di alterare il normale
flusso sequenziale.
Si pone una domanda e in base alla risposta si determina la
successiva operazione da eseguire
Se condizione (vera/falsa) è vera allora
esegui queste operazioni
altrimenti
esegui queste operazioni
52
Operazioni fondamentali
Algoritmo per sommare due numeri
5. se ci ≥ 10 ci = ci -10 e riporto = 1, altrimenti riporto = 0
5. se ci ≥ 10
ci = ci -10 e riporto = 1
altrimenti
riporto = 0
53
Operazioni fondamentali
Operazioni iterative (ciclo) ripetizione di un blocco di
istruzioni
54
Iterazioni per vero
Ciclo while
Il corpo del ciclo viene eseguito 0,1 o più volte (iterazione a
condizione iniziale)
59
Esercizi
• Scrivere un algoritmo che riceva in ingresso un dato
X e calcoli X2 e 1/X fino a che X = 0.
• Scrivere un algoritmo che riceva in ingresso N
numeri interi e determini se tra questi e’ presente il
numero X e la sua posizione.
• Scrivere un algoritmo che riceva in ingresso N
numeri interi e determini il più grande.
• Scrivere un algoritmo per il calcolo del fattoriale di
N.
60
Diagrammi di flusso
61
Diagrammi di flusso
START
Input/Output
istruzione
STOP
62
Diagrammi di flusso
vero falso
proposizione
vero
proposizione
1 1
falso
63
Diagrammi di flusso
Vero Falso
proposizione
A B
sequenza diramazione
IF THEN ELSE
64
Diagrammi di flusso
falso
proposizione
vero
proposizione
falso
vero
65
Diagrammi di flusso
Un diagramma a blocchi è un insieme di blocchi elementari
composto da:
• un blocco iniziale
• un blocco finale
• un numero finito n (n≥1) di blocchi di azione e/o di blocchi di
lettura/scrittura
• un numero finito m (m≥0) di blocchi di controllo
66
Diagrammi di flusso
L’insieme dei blocchi elementari che descrivono un algoritmo deve
soddisfare le seguenti condizioni:
• ciascun blocco di azione o di lettura/scrittura ha una sola freccia
entrante ed una sola freccia uscente
• ciascun blocco di controllo ha una sola freccia entrante e due
frecce uscenti
• ciascuna freccia entra in un blocco oppure si innesta in un’altra
freccia
• ciascun blocco è raggiungibile dal blocco iniziale
• il blocco finale è raggiungibile da qualsiasi altro blocco
69
analisi strutturata
2) è uno schema di selezione
72
analisi strutturata
73
analisi strutturata
In un diagramma strutturato non apparirà mai una
istruzione di salto incondizionato
74
analisi strutturata
Diagramma a blocchi per
la selezione, in un mazzo
di chiavi, di quella che
apre un lucchetto
1) Si seleziona una chiave dal mazzo e la si
marca con un pennarello
2) Si tenta di aprire il lucchetto con la chiave
appena marcata; se funziona, si va al passo 4)
75
Esercizi
• Rappresentare l’algoritmo per il calcolo della distribuzione
dell’età.
• Rappresentare l’algoritmo per il calcolo di xy.
• Rappresentare l’algoritmo per il calcolo dei primi N numeri di
Fibonacci. (1 1 2 3 5 8..)
• Rappresentare l’algoritmo per ordinare in ordine crescente N
numeri (bubble sort)
76
Pseudocodifica
La pseudocodifica è un linguaggio per la descrizione di
algoritmi secondo le regole della programmazione strutturata
77
Pseudocodifica
Tipo delle variabili
Il tipo di una variabile indica l’insieme dei valori che possono
essere assegnati a quella variabile
78
Pseudocodifica: Dichiarazione
delle variabili
Elenco, preceduto dalla parola var, delle variabili sulle quali
l’algoritmo opera
Le variabili sono suddivise per tipo: quelle dello stesso tipo sono
separate l’una dall’altra da una “,”
L’elenco delle variabili dello stesso tipo è seguito dai “:” e
dall’indicazione del tipo;
Esempio:
var i, j, a(20): integer;
p, q: real;
nome: string;
sw: boolean;
79
Descrizione delle azioni
Gli schemi di flusso fondamentali sono descritti utilizzando
convenzioni linguistiche: ad ogni schema strutturato corrisponde
una convenzione linguistica
81
Esempio: stampare i primi 10 multipli di x.
n
Fatt = Fatt * i
Fatt = 1
i=i+1
i=1
i>n
vero falso
1
Fatt
stop
88
Esempio: il calcolo del M.C.D.
95
SVILUPPO TOP DOWN
Es. realizzare un programma per l’analisi della frequenza
delle parole in un testo.
96
SVILUPPO TOP DOWN
INIZIO
RIPETI FINCHE’ NON CI SONO ANCORA RIGHE NEL TESTO
LEGGI LA RIGA
RIPETI FINCHE NON VI SONO ANCORA PAROLE NELLA RIGA
ESTRAI LA PAROLA DALLA RIGA
RICERCA LA PAROLA NELLA TABELLA DELLE PAROLE
SE PAROLA ESTRATTA E’ TROVATA
ALLORA incrementa il contatore frequenza della parola
ALTRIMENTI Inserisci nella tabella la parola estratta
Imposta il contatore frequenza della parola al valore 1
FINE SE
Incrementa il contatore totale delle parole esaminate
ESTRAI LA SUCCESSIVA PAROLA DALLA RIGA
FINE RIPETI ( parole nella riga )
FINE RIPETI (lettura righe)
ARCHIVIA LA TABELLA DELLE PAROLE ARCHIVIA LE STATISTICHE DEL
TESTO
97
FINE
SVILUPPO BOTTOM-UP
Questa metodologia tende ad analizzare un progetto dalle
esigenze specifiche dei sottosistemi che fanno parte del
progetto per poi risalire a livelli piu’ alti per comporre pian piano
il progetto globale.
99
Sottoprogrammi:
esempio Somma di n numeri
leggi n1
somma(in:n1,out: sum1)
media = sum1/n1
stampa media
Gli algoritmi ricorsivi
Un algoritmo si dice ricorsivo quando è definito in termini di
se stesso. Una sua istruzione richiede una nuova esecuzione
dell’algoritmo stesso
109
Gli algoritmi ricorsivi
Esempio: Calcolo del fattoriale di un numero intero
Il fattoriale di n è il prodotto di tutti gli interi da 1 ad n,
n! = n × (n−1) × (n−2) ×...× 2 × 1
Per definizione, 0! = 1
Start fattoriale(n)
input n
if n=0
then f = 1
else f = n × fattoriale(n−1)
endif
output f
Stop 110
Gli algoritmi ricorsivi
La successione di Fibonacci
Leonardo Pisano, detto Fibonacci, pose il seguente
quesito:
Una coppia di conigli giovani impiega una unità di tempo a
diventare adulta; una coppia adulta impiega una unità di
tempo a riprodursi e generare un’altra coppia di conigli
(chiaramente giovani); i conigli non muoiono mai
111
Gli algoritmi ricorsivi
La successione di Fibonacci
112
La successione di Fibonacci
(soluzione Iterativa)
Start
Input N
A = 1; B = 1; I = 1;
finchè I < N ripeti
Fibo = A + B
A = B; B= Fibo;
I=I+1
Output Fibo
Stop
113
Gli algoritmi ricorsivi
La successione di Fibonacci
114
Efficienza
115
Problemi non risolvibili
con Calcolatore Elettronico
116
Problemi non risolvibili
con Calcolatore Elettronico
118
Efficienza - Complessità
Computazionale
Un algoritmo A è più efficiente di un algoritmo B, se
risolve lo stesso problema usando meno risorse.
122
Efficienza - Complessità
Computazionale
Esempio: Trovare l’elemento minimo in un insieme di n
numeri {x1,x2,...,xn}
Soluzione:
1. minimo = x1
2. confronto il minimo con tutti gli altri elementi e se
trovo un elemento più piccolo lo faccio diventare il
nuovo minimo
3. al termine dei confronti, il minimo corrente è
sicuramente il valore cercato
Complessivamente sono stati eseguiti n confronti
124
Efficienza
125
Efficienza
126
Efficienza
Quali fattori influenzano il tempo di esecuzione?
• L’algoritmo scelto per risolvere il problema
• La dimensione dell’input
• La velocità della macchina
Modello di costo
127
Efficienza
Il modello di costo è funzione di:
• Dimensione dell’input
• Istruzione di costo unitario (passo base)
• Calcolo della complessità in numero di passi base
• Complessità
• Nel caso migliore
• Nel caso medio
• Nel caso peggiore
128
Efficienza
Dimensione dell’input
A seconda del problema, per dimensione dell’input si
indicano cose diverse:
• La grandezza di un numero (es: problemi di calcolo)
• Quanti elementi sono in ingresso (es: ordinamento)
• Quanti bit compongono un numero
129
Efficienza
Operazione di costo unitario
È un’operazione la cui esecuzione non dipende dai valori e
dai tipi delle variabili
130
Efficienza
Esempio: Calcolo della complessità in numero di passi
base
i = 0;
while(i < n)
i = i+1;
Assegnamento esterno al ciclo: i=0;
Ciclo while: si compone di un test (i<n) e di un corpo
costituito da un’operazione di assegnamento (i=i+1)
Assegnamento esterno: 1
Numero di test: n+1
Assegnamenti interni: 1*n
132
Algoritmo di ricerca sequenziale
Il numero 31 è presente nella sequenza (52, −48, −34, 75, −80)?
primo passo: 52, −48, −34, 75, −80
52 è uguale a 31? no, quindi si considera l’elemento successivo
secondo passo: 52, −48, −34, 75, −80
−48 è uguale a 31? no, ...
134
Algoritmo di ricerca
sequenziale: efficienza
La sua efficienza in termini del numero di operazioni richieste
(complessità temporale) può essere facilmente valutata, nel caso
peggiore, tenendo conto che:
136
Efficienza
A = {3, -2, 0, 7, 5, 4, 0, 6, -3, -1, 9, 12, 20, 5}
137
Efficienza
Ricerca di un elemento x in un vettore:
i = 0;
while(i<14 && A[i] != x)
i = i+1
Caso migliore: l’elemento cercato è in prima posizione. Il
costo effettivo dell’algoritmo è 2
Caso peggiore: l’elemento cercato è in ultima posizione. Il
costo effettivo è 2*n
Caso medio: ipotesi di distribuzione uniforme (valori siano
disposti casualmente nel vettore)
138
Efficienza
Caso medio: ipotesi di distribuzione uniforme (valori siano
disposti casualmente nel vettore)
139
Algoritmo di ricerca sequenziale
1 Prendi il dizionario
2 Aprilo alla prima pagina
3 Leggi le parole presenti
4 se “xxxx” è presente
5 leggi la definizione
6 altrimenti
7 se è l’ultima pagina
8 non c’è!
9 altrimenti
10 gira pagina
11 vai al punto 3
140
Algoritmo di ricerca sequenziale
1. Prendi il dizionario
2. Aprilo alla prima pagina
3. Leggi le parole presenti
4. se “xxxx” è presente
5. leggi la definizione
6. altrimenti se è dopo
7. gira due pagine
8. vai al punto 3
9. altrimenti se l’ho superato
10. torna indietro di una pagina
11. se “xxxx” è presente
12. leggi la definizione
13. altrimenti
14. non c’è!
141
Algoritmo di ricerca binaria
Un algoritmo più efficiente può essere formulato per il caso particolare in cui la
sequenza sia ordinata secondo un certo criterio, usando un approccio analogo
a quello che si segue nella ricerca di un nome in un elenco telefonico.
142
Algoritmo di ricerca binaria
si confronta l’elemento da cercare (indicato con x) con quello al centro della sequenza
(indicato con c);
se x è uguale a c la ricerca termina (la risposta è “sì”);
in caso contrario:
• se x precede c, la ricerca procede nello stesso modo tra gli elementi che precedono
c
• se x segue c, la ricerca procede nello stesso modo tra gli elementi che seguono c
L’algoritmo termina:
• non appena si trova il valore cercato: il risultato è “sì”
• quando la sottosequenza da considerare non contiene nessun elemento: il risultato è
“no”
Nota: se la sequenza (o sottosequenza) considerata contiene un
numero pari di elementi (N), si considera come elemento centrale
quello in posizione N/2 o N/2 + 1.
143
Algoritmo di ricerca binaria
Determinare se il numero 31 sia presente nella sequenza: (1, 6, 8, 10, 18, 25, 32, 34,
37, 52, 60).
144
Algoritmo di ricerca binaria
Determinare se il numero 8 sia presente nella sequenza: (1, 6, 8, 10, 18, 25, 32, 34,
37, 52, 60).
(1,6,8,10,18)
8 è uguale a 8? sì: l’algoritmo termina
145
Algoritmo di ricerca binaria:
efficienza
Caso peggiore: il numero maggiore di confronti si ha quando l’oggetto da cercare non
è presente nella sequenza considerata, oppure quando si trova nell’ultima
sottosequenza considerata, e questa risulta composta da un solo elemento.
146
Algoritmo di ricerca binaria:
efficienza
Per una sequenza iniziale di N elementi, il numero di confronti nel caso
peggiore (indicato con k), può essere calcolato come segue:
148
Ricerca binaria
1. Prendi il dizionario
2. Aprilo a metà
3. Leggi le parole presenti
4. se “cane” è presente
5. leggi la definizione ∎
6. altrimenti se è prima nel dizionario
7. apri la metà sinistra
8. vai al punto 3
9. altrimenti se è dopo nel dizionario
10. apri la metà destra
11. vai al punto 3
12. altrimenti
13. non c’è!
149
Algoritmi di ordinamento
150
Ordinamento per selezione
Idea di base: spostare l’elemento più piccolo nella prima
posizione della sequenza, quello immediatamente successivo
nella seconda posizione, e così via.
L’algoritmo di ordinamento per selezione ottiene questo risultato
scandendo le posizioni della sequenza dalla prima alla penultima; per
ogni posizione:
• cercare la posizione dell’elemento più piccolo a partire da quello
nella posizione considerata (si può usare un algoritmo analogo a
quello per la ricerca del massimo)
152
Ordinamento per selezione
1) Start
2) I=1
3) ripeti (4-13) I posizione elemento attuale
4) K=I, J=I+1 K posizione elemento minimo
5) ripeti (6-9)
se I e K coincidono
posizione correta passa elemento
6) se V(K)>V(J)
successivo
7) K=J altrimenti scambia elementi e
8) J=J+1 passa elemento successivo
9) finchè J diventa > N
10) se I != K
11) scambio V(I) con V(K)
12) I=I+1
13) finchè I diventa > N-1
14) STOP 153
Ordinamento per selezione
2
1
1 2
154
Ordinamento a bolle
160
Ordinamento a bolle
Ordinamento a bolle
Ordinamento per inserimento
164
Ordinamento per inserimento
Si può allora partire dalla sottosequenza composta dal solo
primo elemento (M = 1), che si può sempre considerare già
ordinata, e:
inserire il secondo elemento nella posizione desiderata
rispetto a tale sottosequenza
165
Ordinamento per inserimento
Ordinare in senso crescente i seguenti numeri, con l’algoritmo
di ordinamento per inserimento: 52, −34, −48, 58, 75, −80, 22.
A ogni passo, in grassetto si mostra la sottosequenza già
ordinata, e in rosso l’elemento da inserire in tale
sottosequenza:
52, −34, −48, 58, 75, −80, 22
−34, 52, −48, 58, 75, −80, 22
−48, −34, 52, 58, 75, −80, 22
−48, −34, 52, 58, 75, −80, 22
−48, −34, 52, 58, 75, −80, 22
−80, −48, −34, 52, 58, 75, 22
−80, −48, −34, 22, 52, 58, 75
Risultato: −80, −48, −34, 22, 52, 58, 75. 166
Ordinamento per inserimento
Input N, V
Indice elemento da ordinare J (parte da 2)
inserisci nella sequenza odinata:
Ripeti (ciclo esterno per tutti gli elementi, J da 2 ad N)
(confronta elemento da inserire con elemento precedente
I = J - 1)
se elemento da inserire è più piccolo allora scambia e
confronta con elementi precedenti
( ciclo interno I = I - 1 )
incrementa J
ripeti
167
Ordinamento per inserimento
1 2
SI NO
I<=0
1 2 168
Algoritmi di ordinamento:
efficienza
La complessità temporale può essere valutata in termini del
numero di confronti da eseguire tra coppie di elementi (dopo
ogni confronto può esserci o meno uno scambio tra due
elementi).
170
Algoritmi di ordinamento:
efficienza
Esempio: ordinamento per inserimento di una sequenza di
N elementi (caso meno vantaggioso, quando gli elementi
dell’insieme da ordinare sono inizialmente disposti secondo
l’ordinamento opposto a quello desiderato)
il ciclo interno eseguirà ogni volta il massimo numero di
iterazioni,perché ogni elemento ai si trova alla massima
distanza dalla posizione corretta in cui deve essere inserito.
Dunque per collocare l’elemento ai il ciclo interno dovrà
eseguire i − 1 iterazioni. Globalmente quindi il numero di
operazioni eseguite dall’algoritmo nel caso peggiore può
essere calcolato come segue:
1+2+…+n−1= 171
Algoritmi di ordinamento:
efficienza
Esempio: ordinamento a bolle di una sequenza di N
elementi
Il caso meno favorevole (sequenza inizialmente ordinata al
contrario).
Ad ogni iterazione del ciclo esterno si riesce a collocare nella
posizione corretta soltanto un elemento dell’insieme;
Sono necessarie n − 1 iterazioni del ciclo esterno per ordinare
l’intera sequenza.
Per ogni iterazione del ciclo esterno il ciclo nidificato al suo
interno esegue ogni volta una ripetizione in meno. Quindi il
numero di operazioni svolte nel caso peggiore può essere
calcolato ancora una volta con la seguente espressione:
172
Algoritmi di ordinamento:
efficienza
Il numero di confronti richiesti dai tre algoritmi di ordinamento
appena descritti, per una sequenza di N elementi, è quindi
proporzionale a N2.
173