Sari la conținut
LECȚIA 18.3 · INFORMATICĂ

Interclasarea a doi vectori sortați

Algoritmul cu doi indici, complexitatea liniară și legătura cu sortarea prin interclasare.

Problema

Ai doi vectori deja sortați crescător. Trebuie să obții un al treilea vector, tot sortat, care conține toate elementele.

De ce nu concatenezi și sortezi

Ar merge, dar ai pierde informația că vectorii erau deja sortați. Concatenare plus sortare înseamnă O((n+m)log⁡(n+m))O((n+m) \log(n+m)). Interclasarea corectă face O(n+m)O(n + m), adică liniar.

Algoritmul

Folosești doi indici, câte unul pentru fiecare vector:

  1. cât timp ambii indici sunt în interiorul vectorilor, compari elementele curente și îl iei pe cel mai mic, avansând indicele corespunzător;
  2. când unul dintre vectori s-a terminat, copiezi restul celuilalt, care e deja sortat.

Pasul 2 e esențial și e cel mai des uitat.

Exemplu

a=[1,4,7]a = [1, 4, 7], b=[2,3,8,9]b = [2, 3, 8, 9]

PasComparăIaRezultat
11 vs 21[1]
24 vs 22[1,2]
34 vs 33[1,2,3]
44 vs 84[1,2,3,4]
57 vs 87[1,2,3,4,7]
6a epuizatrest din b[1,2,3,4,7,8,9]

Legătura cu sortarea prin interclasare

Interclasarea e pasul de bază al algoritmului merge sort: împarți vectorul în două, sortezi fiecare jumătate, apoi le interclasezi. Complexitate totală: O(nlog⁡n)O(n \log n).

Greșeli frecvente

  1. Se uită copierea restului. Verifică mereu cu un exemplu în care un vector se termină primul.
  2. Se folosește un singur indice pentru ambii vectori.
  3. Se presupune că vectorii sunt sortați fără să fie. Interclasarea cere vectori sortați.
EXEMPLU, ÎN 4 LIMBAJE

Alege limbajul în care dai examenul. Poți edita codul și îl poți rula direct aici. Programa oficiala de BAC (proba E.d) cere Pascal sau C/C++, la alegere. Python apare in manualele noi si e pus aici pentru inteles, nu ca limbaj de examen.

#include <iostream>
using namespace std;

int main() {
    int n, m, a[100], b[100], c[200];
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];

    int i = 0, j = 0, k = 0;
    while (i < n && j < m) {
        if (a[i] <= b[j]) c[k++] = a[i++];
        else c[k++] = b[j++];
    }
    while (i < n) c[k++] = a[i++];
    while (j < m) c[k++] = b[j++];

    for (int t = 0; t < k; t++) cout << c[t] << " ";
    return 0;
}
se trimit programului la citire
EXPLOREAZĂ INTERACTIV

compară vecini și îi interschimbă

5
2
9
1
7
3
Pornim.
pasul 1 din 24

Bara colorată cu accent arată mutarea, cea cu verde arată comparația, iar barele estompate sunt deja la locul lor. Numără pașii: pentru același vector, metodele nu fac același număr de operații.