Numero 16 Aprile 2008 - Retrocomputing.net
Numero 16 Aprile 2008 - Retrocomputing.net
Numero 16 Aprile 2008 - Retrocomputing.net
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Jurassic News - Anno 3 - numero <strong>16</strong> - <strong>Aprile</strong> <strong>2008</strong><br />
[1, 2, 0, 0, 0]<br />
e così via fino ad aver esaurito il<br />
vettore di partenza.<br />
Ovviamente si considerare il problema<br />
complementare, cioè andare<br />
a cercare gli elementi più grandi<br />
e costruire il vettore ordinato partendo<br />
dal fondo; le due cose sono<br />
del tutto equivalenti.<br />
Già la descrizione verbale di quello<br />
che avviene ci indica che per un<br />
vettore di N elementi saranno necessarie<br />
N iterazioni, ognuna delle<br />
quali andrà a cercare l’elemento<br />
minimo nel vettore, quindi effettuando<br />
N confronti.<br />
Dovendo passare alla codifica di<br />
un programma per calcolatore faremo<br />
uso di una notazione pseudo-pascal<br />
che è abbastanza facile<br />
da comprendere e molto usata<br />
nella descrizione degli algoritmi.<br />
Possibile implementazione:<br />
minimo := 99;<br />
for j := 1 to N do begin<br />
indice := 0;<br />
for i:=1 to N do begin<br />
if V[i] < minimo then<br />
minimo := V[i];<br />
indice := i;<br />
end;<br />
K[j] := V[indice];<br />
V[indice] := 99;<br />
end;<br />
end;<br />
E’ facile intuire che la complessità<br />
dell’algoritmo proposto è O(2),<br />
cioè cresce con il quadrato del valore<br />
N, numero di elementi che costituiscono<br />
il vettore da ordinare.<br />
Si ricorda che la valutazione della<br />
complessità viene fatta considerando<br />
il termine con l’esponente<br />
più alto in una ipotetica rappresentazione<br />
polinomiale dell’andamento<br />
dell’algoritmo.<br />
Insertion Sort<br />
Fare l’ordinamento utilizzando una<br />
area dati pari alla dimensione del<br />
vettore da ordinare è ovviamente<br />
un compromesso che semplifica<br />
l’algoritmo ma che potrebbe essere<br />
una inaccettabile soluzione rispetto<br />
allo spazio occupato in memoria<br />
dal programma.<br />
In effetti si può anche effettuare il<br />
lavoro direttamente sul vettore originale<br />
provvedendo a scambiare<br />
gli elementi all’interno di un doppio<br />
loop:<br />
for i := 1 to N do begin<br />
for j := i+1 to N do begin<br />
if V[j] < V[i] then<br />
scambia(V[i], V[j]);<br />
end;<br />
end;<br />
Il vettore viene ordinato “sul posto”<br />
e viene diviso in due dall’indice<br />
i che lo percorre nel primo loop.<br />
Gli elementi prima di i appartengono<br />
al vettore ordinato, quelli dopo<br />
sono ancora da ordinare e costituiscono<br />
il “serbatorio” da dove si pesca<br />
l’elemento minore da mettere<br />
nella posizione i-esima.<br />
L’algoritmo proposto prende il<br />
nome di “Insertion Sort” e, se vogliamo<br />
trovare un paragone pratico,<br />
è quello che applichiamo quando<br />
ordiniamo le carte da gioco che<br />
abbiamo in mano: ne preleviamo<br />
una e la “inseriamo” al posto giusto<br />
per avere alla fine una “mano”<br />
42