Vous êtes sur la page 1sur 6

Algoritmi pentru cutarea unui element ntr-un tablou de memorie

Acest algoritm gsete primul element din tablou a crui valoare este o valoare precizat x, n vederea prelucrrii acestui element prin una dintre operaiile urmtoare: modificarea valorii lui; tergerea elementului din tablou; inserarea unui element dup acest element sau naintea lui; consultarea elementului n vederea efecturii unor calcule. Pentru cutarea unui element ntr-un tablou de memorie se pot folosi doi algoritmi: algoritmul de cutare ntr-un tablou de memorie nesortat; algoritmul de cutare ntr-un tablou de memorie sortat. Algoritmi pentru cutarea ntr-un tablou de memorie nesortat In acest caz, cutarea elementului se face prin parcurgerea secvenial a tabloului de memorie pn cnd este gsit elementul. Secvena de instruciuni pentru cutarea elementului ntr-un vector este:
int i=0,n,x,a[10]; // se declar variabila x pentru valoarea elementului cout<<"n= "; cin>>n; cout<<"x= "; cin>>x; ................. // se creeaz vectorul i=0; while (i<n && a[i]!=x) i++; // sau for (i=0; i<n && a[i]!=x; i++); // se parcurg elementele-vectorului pana se gsete // elementul sau pn se termin de parcurs tot vectorul if (i!=n) cout<<"S-a gsit elementul in poziia "<<i+l; else cout<<"Nu s-a gsit elementul";

Algoritmi pentru cutarea ntr-un vector sortat Unul dintre algoritmii cei mai folosii n acest caz este algoritmul de cutare binar. Acest algoritm are la baz principiul njumtirii repetate a domeniului n care se caut elementul, prin mprirea vectorului a n doi subvectori. Notm cu st primul indice al vectorului (indicele elementului din stnga) i cu dr ultimul indice al vectorului (indicele elementului din dreapta), iar mijl este indicele elementului din mijlocul vectorului: mijl=(st+dr)/2. Se compar valoarea cutat cu valoarea elementului din mijloc. Dac cele dou valori sunt egale, nseamn c s-a gsit elementul. Dac nu sunt egale, vectorul a va fi mprit n doi subvectori: subvectorul din stnga: a[st], a[st+1], ..., a[mijl-1]; subvectorul din dreapta: a[mijl+1], ..., a[dr-1], a[dr]. Aadar, operaia de cutare const n identificarea subvectorului n care se poate gsi elementul, prin compararea valorii cutate cu cea a elementului din mijloc, dup care se divizeaz acest subvector n doi subvectori .a.m.d. pn cnd se gsete elementul, sau pn cnd nu se mai poate face mprirea n subvectori, ceea ce nseamn c nu s-a gsit elementul. Se folosesc urmtoarele variabile de memorie: variabila a pentru vector i variabila n pentru lungimea logic a vectorului; variabila x pentru valoarea care trebuie cutat; variabila i pentru parcurgerea vectorului la citire i afiare; variabila st pentru indicele elementului din stnga al vectorului n care se caut; variabila dr pentru indicele elementului din dreapta al vectorului n care se caut; variabila mijl pentru indicele elementului din mijloc al vectorului care se divizeaz; variabila gsit pentru a ti cnd s-a gsit elementul: iniial, are valoarea 0 (valoarea logic False - nu s-a gsit nc elementul), iar atunci cnd se gsete elementul, i se atribuie valoarea 1 (valoarea logic True- s-a gsit elementul). Paii algoritmului, pentru un vector sortat cresctor, sunt:

Pas 1. Se iniializeaz indicii st i dr. st=0 i dr =n-1. Pas 2. Dac vectorul poate fi mprit n subvectori, adic st<=dr, se merge la Pas 3; altfel, se merge la Pas 6 . Pas 3. Se calculeaz indicele elementului din mijlocul vectorului mijl=(st+dr)/2. Pas 4. Dac elementul din mijlocul vectorului are valoarea x (a[mijl]= =x), se merge la Pas 6. Pas 5. Dac elementul din mijlocul vectorului are valoarea mai mare dect x (a[mijl] >x), atunci cutarea se va continua n subvectorul din stnga i se modific valoarea pentru ultimul indice al vectorului dr = mijl-1; altfel, cutarea se va continua n subvectorul din dreapta, i se modific valoarea pentru primul indice al vectorului st= mijl+1. Se revine la Pas 2. Pas 6. Dac st>dr, elementul nu s-a gsit n vector; altfel, elementul s-a gsit n poziia mijl+1. Deoarece cutarea va continua att timp ct nu s-a gsit elementul i vectorul poate fi mprit n subvectori, se va folosi o variabil de memorie gasit pentru a se verifica dac elementul s-a gsit sau nu. Iniial gsit are valoarea 0 (corespunde valorii logice False - nu s-a gsit elementul). n momentul n care se va gsi elementul, gsit va lua valoarea 1 (corespunde valorii logice True- s-a gsit elementul). Secvena de instruciuni pentru cutarea binar ntr-un vector este:
int i,n,x,st,dr,mijl,gsit,a[10]; cout<<"n= "; cin>>n; cout<<"x= " ; cin>>x; ................. // se creeaz vectorul st=0; dr=n-l; gasit=0; while (st<=dr && !gsit) //ct timp vectorul poate fi mprit n subvectori i nu s-a gsit nc elementul {mijl==(st+dr)/2; if(a[mijl]==x) //dac s-a gsit elementul gasit=l; else //dac nu s-a gsit elementul se stabilete subvectorul //n care se continu cutarea if (x<a[mijl]) dr=mijl-l; else st=mijl+l;} if (st>dr) cout<<"Nu s-a gsit elementul"; else cout<<"S-a gsit elementul n poziia "<<mijl + 1;

Algoritm pentru tergerea unui element dintr-un vector Algoritmul pentru tergerea dintr-un vector a elementului cu indicele k nseamn deplasarea elementelor vectorului, ncepnd cu indicele k+1, cu o poziie spre stnga. Lungimea logic a vectorului se va micora cu un element i va fi n-1.
int i,n,k,a[10]; cout<<"n= " ; cin>>n; cout<<"k= "; cin>>k; ............... // se creeaz vectorul for(i=k;i<n-1; i++) a[i]= a[i + l]; // se terge elementul // se afieaz vectorul dup tergerea elementului for(i=0;i<n-l;i++) cout<<a[i]<<" ";

Algoritm pentru inserarea unui element ntr-un vector Algoritmul pentru inserarea intr-un vector a unui element n poziia indicelui k nseamn deplasarea elementelor vectorului, ncepnd cu indicele k+1, cu o poziie spre dreapta i atribuirea noii valori elementului cu indicele k. Lungimea logic a vectorului se va mri cu un element i va fi n+1, cu condiia ca n+1 s fie mai mic sau egal cu lungimea fizic a vectorului, altfel ultimul element al vectorului se pierde.
const int DIM=10; int i,n,k,x,a[DIM];

cout<< "n= " ; cin>>n; cout<< "k= "; cin>>k; cout<< "x= " ; cin>>x; // x contine valoarea care se insereaza ...................// se creeaz vectorul if(n+1<=DIM) {for(i=n ;i>k ;i--) a[i]=a[i-1] ; a[k]=x; for(i=0;i<n+1;i++;) cout<<a[i]<<" ";} else {for(i=n-1;i>k;i- -) a[i]=a[i-1]; a[k]=x; for(i=0;i<n;i++) cout<<a[i]<<" ";}

Enunul problemei 1: Se citesc ntr-un vector, de la tastatur, cel mult 50 de numere ntregi. S se tearg primul element care are valoarea x (x se citete de la tastatur). Se va folosi algoritmul de cutare secvenial pentru a gsi poziia primului element cu valoarea x, i apoi algoritmul de tergere a elementului din acea poziie.
#include<iostream.h> void main () { int i , n , x , k , a [ 5 0 ] ; cout<<"n= " ; cin>>n; cout<<"x= " ; cin>>x; for(i=0;i<n;i++) {cout<<"a[ "<<i+1<<" ]= "; cin>>a [i] ;} i=0; while(i<n && a[i]!=x) i++; if(i!=n) {k=i; //k este poziia elementului care se va terge for(i=k;i<n-l;i++) a[i] = a[i+l]; for(i=0; i<n-l;i++) cout<<a[i]<<" "; } else cout<<"Nu s-a gsit elementul"; }

Enunul problemei 2: Se citesc ntr-un vector, de la tastatur, cel mult 50 de numere ntregi. S se insereze elementul cu valoarea y nainte de primul element care are valoarea x (x i y se citesc de la tastatur). Se va folosi algoritmul de cutare secvenial pentru a gsi poziia primului element cu valoarea x, i apoi algoritmul de inserare a valorii y n acea poziie.
#include <iostream.h> void main() {const int DIM=50 int i,n,k,x,y,a[DIM]; cout<<"n= "; cin>>n; cout<<"x= "; cin>>x; cout<<"y= ":; cin>>y; for(i=0;i<n;i++) {cout<<"a["<<i+l<<" ] = "; cin>>a[i] ;} for(i=0; i<n && a[i]!=x); i++); if(i!=n) {k=i; if(n+1<=DIM) {for(i=n;i>k;i--) a[i]= a[i-l]; a[k]=y; ; for (i=0;i<n+l;i++) cout<<a[i]<<" ";} else {for(i=n-l;i>k;i--) a[i]= a[i-l]; a[k]=y; for(i=0;i<n;i++) cout<<a[i]<<" ";} else cout<<"Nu s-a gsit elementul"; }

Enunul problemei 3: Se citesc ntr-un vector, de la tastatur, cel mult 50 de numere ntregi. Vectorul este sortat cresctor. S se insereze un element cu valoarea x, astfel nct s se pstreze ordonarea cresctoare a elementelor vectorului (x se citete de la tastatur).

Se va folosi algoritmul de cutare binar ntr-un vector sortat, pentru a gsi poziia n care trebuie inserat x, i apoi algoritmul de inserare a elementului cu valoarea x n aceast poziie. Pentru a crete eficiena algoritmului se vor trata separat cazurile n care elementul va fi inserat pe prima poziie sau dup ultima poziie (nu se mai execut secvena de cutare).
#include<iostream.h> void main() {const int DIM=50 int i , k, n, x, s, d, m, a[DIM] ; cout<<"n ="; cin>>n; cout<< "x= " ; cin>>x; for(i=0;i<n;i++) { cout<<"a["<<i+l<<" ] = "; cin>>a[i] ;} if(x<=a[0] ) {for(i=n;i>=l;i--) a[i]=a[i-1]; a[0]=x; } else if(x>=a[n-l]) a[n]=x; else {s=0; d=n-l; while(s<d) {m=(s+d)/2; if(a[m]<x) s=m+l; else d=m-l; k=d+l; //sau k=s; if(n+l<=DIM) {for( i = n ; i > k ; i - - ) a[i]=a[i-1]; a[k]=x; for(i=0;i<n+1;i++) cout<<a[i]<<" ";} else {for( i = n - l ; i > k ; i - - ) a[i]=a[i-1]; a[k]=x; for(i=0;i<n+1;i++) cout<<a[i]<<" ";} } }

Enunul problemei 4: Fiind dat un sir de n numere intregi distincte si o valoare intreaga x, sa se verifice daca x apare in sir si pe ce pozitie. Daca sirul de valori nu este ordonat, sa se ordoneze si apoi sa se foloseasca algoritmul de cautare binara.(Sa se editeze in limbajul C!)
#include<stdio.h> #include<stdlib.h> #define N 50 void main() { int n,i,j,a[N],x,p,q,mij,aux,ok=1; printf("numarul de elemente,n="); do{ scanf("%d",&n); }while(n<1 || n>N); printf("\tIntroduceti elementele vectorului:\n"); for(i=1;i<=n;i++) { printf("a[%d]=",i); scanf("%d",&a[i]); } printf("\n\n\tVectorul introdus este:\n\n"); for(i=1;i<=n;i++) printf("%d ",a[i]); printf("\n\n"); printf("valoarea cautata,x="); scanf("%d",&x); //verificam daca vectorul este ordonat crescator for(i=1;i<n;i++) if(a[i]>a[i+1]) { ok=0; break; //sirul nu este ordonat } if(!ok) //ordonam sirul crescator { printf("\n\nsirul initial nu a fost ordonat!\n");

for(i=1;i<n;i++) for(j=i+1;j<=n;j++) if(a[i]>a[j]) { aux=a[i]; a[i]=a[j]; a[j]=aux; } printf("\n\tVectorul dupa ordonare:\n\n"); for(i=1;i<=n;i++) printf("%d ",a[i]); printf("\n\n"); } //aplicam algoritmul de cautare binara p=1; q=n; while(p<=q) { mij=(p+q)/2; if(a[mij]==x) { printf("\nvaloarea %d apare in sir in pozitia %d\n",x,mij); exit(0); } else if(x<a[mij]) q=mij-1; else p=mij+1; } printf("\nvaloarea %d nu apare in sir\n",x);

Vous aimerez peut-être aussi