Ci è stato posto il problema di ricercare all’interno di un vettore un valore, attraverso la ricerca binaria. La differenza della ricerca binaria da quella sequenziale è il fatto che, quella binaria non controlla tutti i valori contenuti all’interno del vettore, ma:
inizialmente controlla gli estremi dell’intervallo e il valore intermedio. Se il valore non è uguale a nessuno dei tre, allora controlla se il valore cercato è maggiore o minore di quello centrale all’intervallo del vettore; se è minore, il programma reimposta l’estremo destro al valore centrale. Se invece è maggiore, reimposta l’estremo sinistro al valore centrale. Al termine, il programma fornisce il risultato della ricerca: se il valore è stato trovato scrive: “il valore è stato trovato”, altrimenti scrive: “Il valore non è stato trovato”.Il vantaggio che se i numeri sono n, non esegue n controlli ma solo log n.
Abbiamo creato due diversi programmi: uno chiede all’utente i numeri da inserire nel vettore, l’altro, invece, li crea casualmente.
Procedura caricavet;
Inizio
Ripeti
Scrivi('Da quanti valori vuoi che il vettore sia composto?');
Leggi(max);
Finchè (max>0) e (max<100);
Fine;
Procedura acqui;
var i:interi;
Inizio
Per i:=1 a max esegui
Inizio
Scrivi('inserisci il',i,'valore');
Leggi(v[i]);
fine;
fine;
Procedura scambia(var a,b:interi);
Var supporto:interi;
Inizio
supporto:=a;
a:=b;
b:=supporto;
Fine;
Procedura Ordina;
var i,j:interi;
Inizio
Per i:=1 a max-1 esegui
Per j:=i+1 a max esegui
se v[i]>v[j] allora
scambia(v[i],v[j])
fine;
Procedure chiedivet;
Inizio
Scrivi('quale numero vuoi cercare');
Leggi(n);
fine;
Procedure ricercavet;
Var
sx,dx,md:interi;
Inizio
trov:=false;
sx:=1;
dx:=max;
Mentre (trov=false) e (dx>=sx) esegui
Inizio
md:=(sx+dx) div 2;
Se (n=v[sx]) o (n=v[dx]) o (n=v[md]) allora
trov:=true
altrimenti
se md<n allora
sx:=md+1 altrimenti
dx:=md-1;
fine;
fine;
Procedure visua;
Inizio
Se trov=true allora
Scrivi('il numero è stato trovato')
altrimenti Scrivi('il numero non è stato trovato');
fine;
{Programma principale}
Inizio
caricavet;
acqui;
ordina;
chiedivet;
ricercavet;
visua;
fine.
Procedura caricavet;
O
I
Procedura acqui;
O
I
Procedura scambia(var a,b:interi);
Procedura Ordina;
Procedure chiedivet;
O
I
Procedure ricercavet;
Procedure visua;
O O
{Programma principale}
Function mt$random(
var b:integre ):real;external;
Procedura acqui;
var i:interi;
Inizio
Per i:=1 a max esegui
Inizio
a=mth$random(b);
v[i]:=trunc(a*300+1);
fine;
fine;
Procedura scambia(var a,b:interi);
Var supporto:interi;
Inizio
supporto:=a;
a:=b;
b:=supporto;
Fine;
Procedura Ordina;
var i,j:interi;
Inizio
Per i:=1 a max-1 esegui
Per j:=i+1 a max esegui
se v[i]>v[j] allora
scambia(v[i],v[j])
fine;
Procedure chiedivet;
Inizio
Scrivi('quale numero vuoi cercare?(un valore compreso tra 1 e 300');
Leggi(n);
fine;
Procedure ricercavet;
Var
sx,dx,md:interi;
Inizio
trov:=false;
sx:=1;
dx:=max;
Mentre (trov=false) e (dx>=sx) esegui
Inizio
md:=(sx+dx) div 2;
Se (n=v[sx]) o (n=v[dx]) o (n=v[md]) allora
trov:=true
altrimenti
se md<n allora
sx:=md+1 altrimenti
dx:=md-1;
fine;
fine;
Procedure visua;
Inizio
Se trov=true allora
Scrivi('il numero è stato trovato')
altrimenti Scrivi('il numero non è stato trovato');
fine;
{Programma principale}
Inizio
Max:=100;
caricavet;
acqui;
ordina;
chiedivet;
ricercavet;
visua;
Scrivi(‘ ‘);
Scrivi(‘ ‘);
Scrivi(‘ Il programma è stato realizzato da Teodoro Montanaro e Alessio Massaro ‘);
fine.
Procedura acqui;
Procedura scambia(var a,b:interi);
Procedura Ordina;
Procedure chiedivet;
O
I
Procedure ricercavet;
Procedure visua;
O O
{Programma principale}
O
O
O