Interclasarea a doi vectori sortați
Ideile de bază pe scurt și, unde există, exercițiile din subiectele de BAC care le verifică. Lecția completă, animată, cu grile și exerciții corectate, e în aplicația Tomomi.
Pe scurt
Șablon: bucla de comparare
Doi indici, un singur avans per pas:
int i = 0, j = 0, k = 0;
while (i < n && j < m) {
if (a[i] <= b[j]) {
c[k] = a[i];
i++;
} else {
c[k] = b[j];
j++;
}
k++;
}
Idee: de ce ajunge o singură trecere
Fiecare vector fiind deja sortat, cel mai mic element necopiat este obligatoriu unul dintre cei doi candidați a[i] și b[j]. Nu trebuie să cauți minimul în tot vectorul, deci fiecare element este vizitat o singură dată. Condiția esențială este ca vectorii de intrare să fie SORTAȚI.
Șablon: cele două bucle de rest
Se scriu amândouă; se execută cel mult una:
while (i < n) {
c[k] = a[i];
i++;
k++;
}
while (j < m) {
c[k] = b[j];
j++;
k++;
}
Capcana: bucla de rest uitată
Prima buclă se oprește la epuizarea PRIMULUI vector (condiția are &&), deci în celălalt rămân aproape mereu elemente. Dacă omiți una dintre buclele de rest, programul trece de testele în care restul a rămas în vectorul pe care îl copiezi și pică exact pe celelalte - o eroare care se ascunde bine.
Șablon: reuniunea (fără duplicate)
Trei ramuri; la egalitate scrii o valoare și avansezi ambii indici:
if (a[i] < b[j]) {
c[k] = a[i]; i++; k++;
} else if (b[j] < a[i]) {
c[k] = b[j]; j++; k++;
} else {
c[k] = a[i]; i++; j++; k++;
}
Capcana: câte elemente are rezultatul
Interclasarea clasică dă exact n + m elemente și păstrează duplicatele. Reuniunea dă n + m minus numărul valorilor comune. Dacă la egalitate avansezi un singur indice, valoarea comună este comparată din nou și ajunge de două ori în rezultat.