16.07.2014 Views

Numero 16 Aprile 2008 - Retrocomputing.net

Numero 16 Aprile 2008 - Retrocomputing.net

Numero 16 Aprile 2008 - Retrocomputing.net

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!