Documente Academic
Documente Profesional
Documente Cultură
p=m+1;
k=log2n. Numrul de operaii este cel mult egal cu 2*k deci cu 2*log2n. n
consecin, ordinul de complexitate al algoritmului este O(log2(n)).
3. 2. Inserare i tergere
Numim inserare operaia de introducere ntr-un vector a unei noi valori, pe o poziie
cunoscut, fr a pierde vreo valoare dintre cele deja existente.
Numim tergere operaia de eliminare din vector a unei valori a crei poziie este
cunoscut.
Inserare : n vectorul x cu n elemente s insereaz valoarea v, pe poziia p (1pn+1).
Exemplu :
Iniial : n=5, p=3, v=17
x
10 20 30 40 50
2
3
4
5
ranguri 1
ranguri
10
Final : n=6
20 17 30 40
50
Algoritm de rezolvare :
Pasul 1: se deplaseaz cu cte o poziie spre dreapta toate valorile ce ocup
rangurile : n,n-1,,p .
Astfel se suprascriu elementele x[n+1],x[n],,x[p+1]
Pasul 2: numrul de valori din vector se incrementeaz
Pasul 3: se suprascrie elementul x[p] atribuindu-i-se valoarea v
Implementare :
for(i=n; i>=p; i-- )
x[i+1]=x[i];
n++;
x[p]=v;
Exemplu :
x
10
ranguri
50
5
x
ranguri
10
1
Final : n=4
20
40
2
50
4
Algoritm de rezolvare :
Pasul 1: se deplaseaz cu cte o poziie spre stnga toate valorile ce ocup
rangurile : p+1,p+2,,n.
Astfel se suprascriu elementele x[p],x[p+1],,x[n-1]
Pasul 2: numrul de valori din vector se decrementeaz
Implementare :
for(i=p+1; i<=n; i++ )
x[i-1]=x[i];
n--;
3. 3. Permutare circular
Permutare circular stnga cu o poziie
Exemplu :
10
Iniial
20
30
40
50
20
30
Final
40
50
10
ranguri
ranguri
Algoritm de rezolvare :
Pasul 1: se pstreaz ntr-o variabil auxiliar valoarea primului element
Pasul 2: se deplaseaz cu cte o poziie spre stnga toate valorile ce ocup
rangurile : 2,3,,n.
Astfel se suprascriu elementele x[1],x[2],,x[n-1]
Pasul 3: se suprascrie elementul x[n] cu valoarea variabilei auxiliare
Implementare :
aux=x[1];
for(i=2; i<=n; i++ )
x[n]=aux;
x[i-1]=x[i];
10
20
rangur
i
Iniial
30
40
3
50
5
50
10
Final
20
30
40
ranguri
Algoritm de rezolvare :
Pasul 1: se pstreaz ntr-o variabil auxiliar valoarea ultimului element
Pasul 2: se deplaseaz cu cte o poziie spre dreapta toate valorile ce ocup
rangurile : n-1,n-2,,1
Astfel se suprascriu elementele x[n],x[n-1],,x[2]
Pasul 3: se suprascrie elementul x[1] cu valoarea variabilei auxiliare
Implementare :
aux=x[n];
for(i=n-1; i>=1; i-- )
x[i+1]=x[i];
x[1]=aux;
3. 4. Interclasare
Numim interclasare operaia prin care valorile aflate n doi vectori ordonai se
reunesc ntr-o singur colecie de valori, direct ordonat.
Problem :
Considerm vectorul x cu n componente i vectorul y cu m componente,
ordonai cresctor. S se afieze pe ecran toate valorile aflate n cei doi vectori, n
ordine cresctoare.
Exemplu :
Intrare : n=6, x=( 1, 3, 4, 5, 5, 22 )
m=7, y=( 2, 3, 3, 7, 9, 10, 15 )
Ieire : 1 2 3 3 3 4 5 5 7 9 10 15
22
Algoritm de rezolvare :
Faza 1 : se parcurg n paralel cei doi vectori pn cnd unul dintre ei se termin
Pasul 1: se iniializeaz contorii i,j cu care se puncteaz pe cei doi vectori
(i=1,j=1). Cu contorul i se acceseaz rangurile vectorului x iar cu
contorul j se acceseaz rangurile vectorului y
Atta timp ct nici unul dintre vectori nu s-a parcurs n totalitate se execut pasul 2
Pasul 2: se compar x[i] cu y[j]. Exist 2 cazuri :
ox[i]y[j] : se scrie x[i] i se acceseaz rangul urmtor numai n x
o x[i]>y[j] : se scrie y[j] i se acceseaz rangul urmtor numai n y
Faza 2 : se vor afia toate valorile rmase nescrise din vectorul ce nu s-a terminat
Pasul 3: se parcurge vectorul x ncepnd din poziia i i fiecare element ntlnit se
afieaz
Pasul 4: se parcurge vectorul y ncepnd din poziia j i fiecare element ntlnit se
afieaz
Numai unul dintre paii 3,4 va avea ca avea ca efect afiarea, deoarece unul dintre
vectori s-a terminat ( ori i>n ori j>m ).
Implementare :
i=1; j=1;
while ( i<=n && j<=m )
if ( x[i]<=y[j] ) { cout<<x[i]<<" ";
i++ ;
}
else
{ cout<<y[j]<<" ";
j++; }
for(k=i;k<=n; k++ )
cout<<x[k]<<" ";
for(k=j;k<=m; k++ )
cout<<y[k]<<" ";
Se dau dou mulimi n doi vectori ordonai cresctor. S se afieze reuniunea celor
dou mulimi, ca mulime ordonat descresctor.
Aceast problem reprezint o aplicaie a interclasrii.
Diferen : n situaia n care se ntlnesc dou valori egale se vor accesa rangurile ce
urmeaz att ntr-un vector ct i n cellalt.
Implementare :
i=n; j=m;
while ( i>=1 && j>=1 )
if ( x[i]==y[j] ) { cout<<x[i]<<" ";
i-- ; j--; }
else
if (x[i]>y[j] { cout<<x[i]<<" ";
i--; }
else { cout<<y[j]<<" ";
j--; }
for(k=i;k>=1; k-- )
cout<<x[k]<<" ";
for(k=j;k>=1; k-- )
cout<<y[k]<<" ";
3. 5. Sortare
Numim sortare operaia de ordonare cresctoare sau descresctoare a valorilor
memorate ntr-un vector.
Problem : Fie x un vector cu n componente. S se ordoneze acesta cresctor.
Exemplu :
x
30
20
Iniial
40 10
60
50
rangur
i
ranguri 1
10
20
Final
30 40
50
60
Metoda seleciei
Aceasta presupune selectarea la fiecare pas a minimului pe secvena nc nesortat
urmat de plasarea valorii minime pe prima poziie a secvenei respective.
Principiul se repet pe urmtoarea secven nesortat., pn la sortarea ntregului
vector.
Exemplificare :
Etapa 1: secvena nesortat ocup rangurile 1,2,3,4,5,6
se determin rangul minimului ( r ) din secvena x[1],x[2],,x[6]
Rezult r=4
se interschimb x[1] cu x[4] i astfel vectorul va fi :
x
10
ranguri 1
20
40
30
60
50
10
ranguri 1
20
40
30
60
50
10
ranguri 1
20
30
40
60
50
10
ranguri 1
20
30
40
60
50
10
ranguri 1
20
30
40
50
60
x[j]=aux;
30
rangur
i
20
Iniial
40 10
60
50
10
ranguri 1
20
Final
30 40
50
60
Aplicaie :
n fiierul text aplic.txt sunt scrise separate prin spaiu: pe prima linie
valorile naturale nenule n i m (0<n,m100, n<m), pe linia a doua cele n elemente ale
tabloului unidimensional a iar pe linia a treia cele m elemente ale tabloului
unidimensional b. Elementele tablourilor sunt numere ntregi cu maxim 4 cifre fiecare.
S se verifice dac exist n b o secven de lungime n n care s se regseasc toate
elementele lui a, nu neaprat n aceeai ordine. Dac nu exist o astfel de secven se
va afia pe ecran valoarea 0 iar dac exist se va afia pe ecran primul indice din b n
care ncepe aceasta.
Exemplu : dac fiierul aplic.txt are 3 7
2 4 1
coninutul alturat, pe ecran se afieaz : 4
3 4 8 4 2 1 9
#include <fstream.h>
#include <iostream.h>
int main() {
int n,m,a[101], b[101],i,j,k,aux,s, rang=0, x[101];
ifstream f("aplic.txt");
f>>n>>m; for(i=1;i<=n;i++) f>>a[i];
3. 6. Vector caracteristic
Problema 1 :
n fiierul text numere.in sunt scrise separate prin spaiu, pe mai multe
linii, cel mult 106 numere naturale cu maxim 8 cifre fiecare. S se afieze pe ecran,
separate prin spaiu i n ordine cresctoare, toate cifrele sistemului de numeraie
zecimal care s-au folosit la scrierea numerelor din fiier.
Intrare : numere.in
Ieire
1230123 345812
0 321 555
Implementare :
#include <fstream.h>
#include <iostream.h>
int v[10]; /* compilatorul realizeaz iniializarea */
int main() {
long x; int c;
ifstream f("numere.in");
while ( f>>x )
do {
c=x%10;
v[c]=1; x=x/10; }
while (x);
f.close();
for(c=0;c<=9;c++) if ( v[c] ) cout<<c<<" ";
return 0;
}
ieire.txt
TSRIHHHGGFEDBBAA
Implementare :
#include <fstream.h>
#include <iostream.h>
int v[27];
int main() {
char L; int i,j;
ifstream f("intrare.txt");
while ( f.peek()!=EOF ) { L=f.get(); v[L-64]++; }
f.close();
ofstream g("iesire.txt");
for(i=26; i>=1; i--)
for(j=1;j<=v[i]; j++)
g.close();
return 0;
}
g<<(char)(i+64);