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; }