Sunteți pe pagina 1din 2

Algoritm pentru interclasarea a doi vectori

Interclasarea a doi vectori nseamn reuniunea celor doi vectori


simultan cu ordonarea elementelor vectorului rezultat.
Presupunem c cei doi vectori sunt sortai (cresctor sau
descresctor). Prin acest algoritm se parcurg simultan cei doi vectori
surs pentru a se compara un element dintr-un vector cu un element din
cellalt vector.
Elementul cu valoarea mai mic, respectiv mai mare, este copiat n
vectorul destinaie i ters din vectorul surs. Procesul continu pn
cnd este epuizat unul dintre vectori. Elementele rmase n cellalt
vector se adaug la sfritul vectorului destinaie.
Se folosesc urmtoarele variabile de memorie pentru:
- vectori: a i b - vectorii surs (se presupune c sunt deja sortai
cresctor sau descresctor) i c - vectorul rezultat (vectorul destinaie)
care reunete elementele din vectorii a i b, ordonate dup acelai
criteriu ca i cele din vectorii surs;
- lungimile logice ale vectorilor: n - pentru vectorul a (se introduce d
e
la tastatur) i m - pentru vectorul b (se introduce de la tastatur);
lungimea vectorului c va fi n+m;
- contorii pentru parcurgerea vectorilor: i - pentru vectorul a, j - pen
tru
vectorul b si k - pentru vectorul c.
Pasii algoritmului (pentu vectori sortati crescator) sunt:
Pas 1. Se iniializeaz variabilele contor, pentru vectorii surse i pentru
vectorul rezultat, cu 0: i=0, j=0, k=0.
Pas 2. Se compar elementele a[i] i b[j]. Dac a[i]<b[j] se copie elementul
a[i] n vectorul c prin c[k]=a[i] i se terge elementul a[i] din vectorul a;
altfel, se copie elementul b[j] n vectorul c prin c[k]=b[j] i se terge
elementul b[j] din vectorul b. Operaia de tergere nu se execut prin
eliminarea efectiv a elementului din vector, ci prin incrementarea
contorului: dace se terge elementul din vectorul a se incrementeaz contorul
i, iar dac se terge elementul din vectorul b se incrementeaz contorul j.
Pas 3. Se incrementeaz contorul k pentru c urmeaz s se copie un element
n acest vector.
Pas 4. Se compar contorii vectorilor surs cu lungimea lor. Dac fiecare
contor este mai mic sau egal cu lungimea vectorului (i<n i j<m) se revine
la pasul 2, n caz contrar se trece la pasul urmator.
Pas 5. Se adaug la fritul vectorului c elementele rmase n cellalt,
printr-o simpl operaie de copiere: dac i<n nseamn c s-a epuizat
vectorul b i se vor aduga la vectorul c elementele rmase n vectorul a (se
execut c[k]=a[i], k=k+1, i=i+1 pn cnd i devine egal cu lungimea n a
vectorului a); altfel, s-a epuizat vectorul a i se vor aduga la vectorul
c elementele rmase n vectorul b (se execut c[k]=b[j], k=k+1, j=j+1 pn
cnd j devine egal cu lungimea m a vectorului b).
#include<iostream>
using namespace std;
void main()
{
int i,j,k,n,m,a[50],b[50],c[100];
cout<<"Introduceti dimensiunea primului vector : ";
cin>>n;
cout<<"Introduceti dimensiunea celui de al doilea vector : ";
cin>>m; // se citesc cei doi vectori ordonati deja crescator !
cout<<endl;

cout<<"ATENTIE! Vectorii trebuie introdusi ordonati crescator"<<endl<<endl;


cout<<"Componentele primului vector"<<endl;
for(i=0;i<n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
cout<<"Componentele celui de al doilea vector"<<endl;
for(j=0;j<m;j++)
{
cout<<"b["<<j<<"]=";
cin>>b[j];
}
// incepe interclasarea celor doi vectori
i=0; j=0; k=0;
while( i<n && j<m )
{
if(a[i]<b[j])
{
c[k]=a[i];
i=i+1;
}
else
{
c[k]=b[j];
j=j+1;
}
k=k+1;
}
if(i<n)
while(i<n)
{
c[k]=a[i];
k=k+1;
i=i+1;
}
else
while(j<m)
{
c[k]=b[j];
k=k+1;
j=j+1;
}
// este afisat vectorul obtinut
for(k=0;k<n+m;k++)
cout<<c[k]<<" ";
cout<<endl;
return 0;
}

S-ar putea să vă placă și