Sistemi e Tecnologie
Informatiche
Problemi di ordinamento
Umberto Ferraro Petrillo
Obiettivo della lezione

Presenteremo un semplice ed importante
problema da risolvere mediante
un approccio “ragionato”

Introdurremo le nozioni di algoritmo, struttura
dati ed efficienza di un algoritmo
Domanda …

Cosa rende un elenco telefonico di semplice
consultazione?
Risposta:
 I nominativi riportati sono elencati in ordine
alfabetico!

Come si ordina un elenco di nomi?
Problema
Compilazione di un elenco dei partecipanti al corso
e dei rispettivi voti (ordinato per cognome)









Zuzzurellone Zaira
Bamonte Giovanni
Romano Nadia
Medio Massimo
Del Monte Francesco
Rufolo Carmine
Donnaruma Giovanni
Santonastaso Maria
Abate Alfonso
24
26
21
28
30
19
27
25
27
Ordinamento di un elenco (ver. 1)
Elenco di partenza














Zuzzurellone Zaira
Bamonte Giovanni
Romano Nadia
Medio Massimo
Del Monte Francesco
Rufolo Carmine
Donnaruma Giovanni
Santonastaso Maria
Abate Alfonso
Elenco ordinato









Abate Alfonso
Bamonte Giovanni
Del Monte Francesco
Donnaruma Giovanni
Medio Massimo
Romano Nadia
Rufolo Carmine
Santonastaso Maria
Zuzzurellone Zaira
Individua il primo nominativo in ordine alfabetico nell’elenco di input
Riponi l’elemento individuato nella posizione 1 dell’elenco ordinato ed eliminalo
dall’elenco di partenza
Individua il primo nominativo in ordine alfabetico nell’elenco di input
Riponi l’elemento individuato nella posizione 2 dell’elenco ordinato ed eliminalo
dall’elenco di partenza
….
Procedura risolutiva
(prima versione)



Sia i l’indice della posizione attualmente considerata
(inizialmente i = 0)
Sia n la taglia dell’elenco da ordinare
Ripeti per n volte la seguente procedura:
 Scorri l’elenco di input ed individua il primo
nominativo in ordine alfabetico
 Riponi l’elemento individuato nella posizione i
dell’elenco ordinato ed eliminalo dall’elenco di
partenza
 Incrementa i di 1 (i = i +1)
Ordinamento di un elenco (ver 2)









Zuzzurellone Zaira
Donnaruma Giovanni
Romano Nadia
Medio Massimo
Del Monte Francesco
Rufolo Carmine
Bamonte Giovanni
Santonastaso Maria
Abate Alfonso
Cambiamo
Abate Alfonso con il
primo elemento
dell’elenco e
vice-versa









Abate Alfonso
Donnaruma Giovanni
Romano Nadia
Medio Massimo
Del Monte Francesco
Rufolo Carmine
Bamonte Giovanni
Santonastaso Maria
Zuzzurellone Zaira
Cambiamo
Bamonte Giovanni con
il secondo elemento
dell’elenco e
vice-versa









Abate Alfonso
Bamonte Giovanni
Romano Nadia
Medio Massimo
Del Monte Francesco
Rufolo Carmine
Donnaruma Giovanni
Santonastaso Maria
Zuzzurellone Zaira
Cambiamo
Del Monte Francesco
con il terzo elemento
dell’elenco e
vice-versa
Procedura risolutiva
(seconda versione)



Sia i l’indice della posizione attualmente considerata
(inizialmente i = 0)
Sia n la taglia dell’elenco da ordinare
Ripeti per n-1 volte la seguente procedura:
 Scorri l’elenco di input nella porzione da i ad n ed
individua il primo nominativo in ordine alfabetico
 Scambia l’elemento individuato con l’elemento
nella posizione i (se necessario)
 Incrementa i di 1 (i = i +1)
Algoritmo

Procedura di calcolo consistente in un insieme di passi
(istruzioni) e finalizzata alla risoluzione di un problema

E’ tipicamente descritto utilizzando il linguaggio naturale:
E.g. “Scorri l’elenco di input ed individua il primo
nominativo in ordine alfabetico”

Un algoritmo può essere implementato attraverso un
linguaggio di programmazione …

… tuttavia, esso non dipende da uno specifico linguaggio
di programmazione
Struttura dati

Le informazioni elaborate da un algoritmo sono definite dati
(e.g., elenco nominativi da ordinare)

I dati si possono presentare:
 in una forma elementare (e.g., il numero di studenti che segue la
lezione)
 in una forma strutturata (e.g, l’elenco degli studenti e delle loro
generalità)

Una struttura dati può godere di determinate proprietà utili a risolvere un
certo problema (e.g., l’elenco telefonico è ordinato alfabeticamente,
sono quindi in grado di cercare un nome velocemente)

La scelta di una particolare struttura dati influisce sull’efficienza di un
programma e sulla semplicità di realizzazione dello stesso
Implementazione di un algoritmo

L’elaborazione dei dati presuppone una loro
rappresentazione (e.g., numero telefonico
rappresentato come numero intero, nome di un
utente rappresentato come array di caratteri)
Rappresentazione dei dati
Problema: Fornire una rappresentazione in C/C++
dei dati sotto elencati









Zuzzurellone Zaira
Bamonte Giovanni
Romano Nadia
Medio Massimo
Del Monte Francesco
Rufolo Carmine
Donnaruma Giovanni
Santonastaso Maria
Abate Alfonso
24
26
21
28
30
19
27
25
27
Rappresentazione dei dati
Ipotesi 1:
Adoperiamo un array di taglia 3n
0
1
2
Zuzzurellone Zaira
24
3
4
Bamonte Giovanni
5
6
26
Romano
Ipotesi 2:
Adoperiamo una matrice di taglia nx3
0
1
2
0
Zuzzurellone
Zaira
24
1
Bamonte
Giovanni
26
2
Romano
Nadia
21
Rappresentazione dei dati
Ipotesi 3:
Adoperiamo 3 array distinti
0
1
2
Zuzzurellone
Bamonte
Romano
0
1
2
Zaira
Giovanni
Nadia
0
1
2
24
26
21
Rappresentazione dei dati
Ipotesi 4:
• Definiamo una classe studente
• Adoperiamo un array di taglia n di oggetti “studente”
0
1
2
Nome:
Zaira
Nome:
Zaira
Nome:
Zaira
Cognome:
Zuzzurellone
Cognome:
Zuzzurellone
Cognome:
Zuzzurellone
Voto:
24
Voto:
24
Voto:
24
Ordinamento di un elenco di
voti (Selection Sort)



Sia i l’indice della posizione attualmente considerata
(inizialmente i = 0)
Sia n la taglia dell’elenco da ordinare
Ripeti per n-1 volte la seguente procedura:
 Scorri l’elenco di input nella porzione da i ad n ed
individua il voto più alto
 Scambia l’elemento individuato con l’elemento
nella posizione i (se necessario)
 Incrementa i di 1 (i = i +1)
Ordinamento di un elenco di
voti (Selection Sort)
0
1
2
3
4
5
6
7
8
24
26
21
28
30
19
27
25
27
Scorriamo l’array
da 0 ad 8 per
individuare
il numero + alto
24
26
21
28
30
19
27
25
27
30
26
21
28
24
19
27
25
27
Il numero + alto
è 30, lo
scambiamo con
l’elemento alla
prima posizione
Scorriamo l’array
da 1 ad 8 per
individuare
il numero + alto
30
24
21
26
28
19
27
25
27
Il numero + alto è
28, lo scambiamo
con l’elemento
alla seconda
posizione
Ordinamento di un elenco di
voti (Selection Sort)
0
1
2
3
4
5
6
7
8
24
26
21
28
30
19
27
25
27
30
26
21
28
24
19
27
25
27
30
26
21
28
24
19
27
25
27
30
28
21
26
24
19
27
25
27
30
28
21
26
24
19
27
25
27
30
28
27
26
24
19
21
25
27
30
28
27
26
24
19
21
25
27
30
28
27
27
24
19
21
25
26
30
28
27
27
24
19
21
25
26
…
30
28
27
27
26
25
24
21
19
Votin [],
n){
Sia
Voti SelectionSort(int
l’elenco di input ed
la int
taglia
1 void
dello
stesso
2
3 int i, i_max;
Sia i l’indice dell’elemento attualmente considerato (i=0)
e4sia i_max l’indice dell’elemento massimo in Voti[i…n]
5
(i =n-1
0; ivolte
< n-1;lai++)
{
Ripeti
seguente
procedura
6 forper
7
Assumi
il valore nella posizione Voti[i] essere il
i_max
i;
8
massimo
nel=sottoelenco
Voti[i…n], (i = i_max)
//
ricerca
il
valore
massimo
in Voti[i..n]
9
j = i+1; j < Voti[i+1
n-1; j++) … n]
Cercafor
nel(int
sottoelenco
10
(Voti[j]
Voti[i_max])
11
il valoreif più
alto>ed
assegnane
i_max
= j;
// j è il nuovo i_max
12
l’indice ad
i_max
13
// scambia (se necessario) Voti[i_max] e Voti[i]
14
if (i != i_max) {
15
int temp
= Voti[i_max];
Se i_max
è diverso
da i, scambia
16
17
Voti[i] eVoti[i_max]
Voti[i_max]= Voti[i];
Voti[i] = temp;
18
}
19
20
21 }
22 }
23
i – Separa gli elementi
ordinati da quelli da
ordinare
j – Viene utilizzata per
scorrere gli elementi
da ordinare
temp – Serve come
variabile temporanea per
operare lo scambio
di due valori
i_max – Conserva l’indice
del valore piu’ alto
all’interno della porzione
di elenco non ordinata
Scarica

Lezione 2: Problemi di Ordinamento