Soluzioni degli esercizi proposti a lezione il 2 Novembre
program Uso_Array
const Imax = 100;
type VettInt = array [1..Imax] of integer;
var a:VettInt;
n,max:integer;
procedure ReadArray(var v:VettInt; n:integer);
var i:integer;
begin
for i:=1 to n do
begin
writeln('Elemento numero ',i,':');
readln(v[i]);
end
end;
procedure WriteArray(var v:VettInt; n:integer);
var i:integer;
begin
for i:=1 to n do
begin
writeln('Elemento numero ',i,' : ');
writeln(v[i]);
end
end;
function MaxVett(var v:VettInt; n:integer):integer;
var i, max: integer;
begin
max:=v[1];
for i:=2 to n do
if (v[i]>max) then max:=v[i];
MaxVett:=max
end;
procedure scambia (var a,b:integer);
var temp:integer;
begin
temp:=a;
a:=b;
b:=temp
end;
procedure SelectionSort (var v:VettInt; n:integer);
{pre:}
{post: restituisce l'array ordinato in ordine crescente}
var pos,i,j:integer;
begin
for i:=1 to n-1 do {rendi v[1..i] ordinato e tale che sia <= di v[i+i..n]}
begin {trova la posizione del piu` piccolo elemento in a[i..n]}
pos:=i;
for j:=i+1 to n do {trova la posizione del piu` piccolo elemento in a[i..j]}
if (v[j] < v[pos]) then pos:=j;
scambia(v[i],v[pos]); {questa istruzione fa parte del ciclo 'for' piu' esterno!}
end
end;
{NOTA 1: A lezione, insieme, avevamo trovato la soluzione seguente:
procedure SelectionSort (var v:VettInt; n:integer);
var i,j:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if (v[j] < v[i]) then scambia(v[i],v[j]);
end;
Questa soluzione (B) differisce da quella data sopra (A) solo per il numero di scambi
effettuati. Infatti la versione A fa uno scambio soltanto (tra a[i] e a[pos]), dopo
aver ultimato la ricerca della posizione dell'elemento minimo (che si trovera` appunto
in posizione 'pos'). La versione B, invece, scambia v[i] con v[j] ogni volta che
v[j] e` piu' piccolo di v[i] (calcola il minimo fra gli elementi compresi tra i e j, e,
ovviamente, quando j = n in v[i] ci sara` il minimo assoluto tra i e n).
NOTA 2: dal punto di vista della complessita` in termini di tempo (misurata in termini
del numero di iterazioni fatte), il SelectionSort e` O(n^2), ovvero l'istruzione
dentro il 'for' piu' interno viene eseguita un numero di volte proporzionale a
n^2 (dove n e` il numero di elementi nel vettore). Infatti tale istruzione viene
eseguita (n-1) volte quando i=1, (n-2) volte quando i=2,... , 1 volta quando i=n-1. La
somma (n-1)+(n-2)+...+1 e` uguale a (n(n-1))/2 (siccome la sommatoria dei primi
'k' numeri naturali e` uguale a ((k+1)k)/2), per cui il numero di volte che tale
istruzione e` eseguita e` (n^2-n)/2 (per cui proporzionale a n^2).
}
procedure InsertionSort (var v:VettInt; n:integer);
LA SOLUZIONE SARA` PRESENTATA IN UNA DELLE PROSSIME LEZIONI
{main program}
begin
repeat
begin
writeln('Inserisci il numero degli elementi (0 < num elem <= 100):');
readln(n);
end
until (n>0) AND (n <= Imax);
writeln;
writeln('Inserisci gli elementi nel vettore (', n, '):');
ReadArray(a,n);
writeln;
readln;
max:=MaxVett(a,n);
writeln('Stampa del Vettore');
WriteArray(a,n);
writeln;
writeln('Il massimo e` ', max);
writeln;
readln;
{Uso del SelectionSort1}
writeln('** Vettore non ordinato **');
WriteArray(a,n);
writeln;
SelectionSort(a,n);
writeln('** Vettore Ordinato con SelectionSort **');
WriteArray(a,n);
writeln;
readln;
{Uso dell'InsertionSort}
writeln('Inserisci gli elementi nel vettore (', n, '):');
writeln;
ReadArray(a,n);
writeln;
readln;
InsertionSort(a,n);
writeln('** Vettore Ordinato con InsertionSort **');
WriteArray(a,n);
readln;
end.