# Sortarea vectorilor de structuri

> Pagina: https://bacalaurescu.ro/informatica/lectii/structuri-de-date/sortarea-vectorilor-de-structuri
> Markdown: https://bacalaurescu.ro/informatica/lectii/structuri-de-date/sortarea-vectorilor-de-structuri.md
> Sursa: Bacalaurescu (bacalaurescu.ro), conținut gratuit pentru BAC 2027.

Materia: [Informatică](https://bacalaurescu.ro/informatica)

Capitolul: [Structuri (struct)](https://bacalaurescu.ro/informatica/lectii/structuri-de-date)
Actualizat: 2026-11-01

Sortarea după un câmp, cu departajare pe al doilea criteriu: catalogul complet.

## Pe scurt pentru BAC

- La sortarea pe două criterii schimbi elementele când primul criteriu e încălcat strict sau când e egal și al doilea e încălcat.
- Pentru ordine alfabetică la medii egale schimbi când `strcmp(v[j].nume, v[j+1].nume) > 0`.
- Interschimbarea copiază structura întreagă, `aux = v[j]`, deci numele și media rămân împreună.
- Cu vectori paraleli, ca `nume[100][21]` și `medie[100]`, trebuie interschimbate ambele, numele prin `strcpy`.

## Problema-tip

"Afișați elevii în ordinea DESCRESCĂTOARE a mediilor; la medii egale, ALFABETIC." Două criterii, o singură sortare.

## Soluția completă

```cpp
#include <iostream>
#include <cstring>
using namespace std;
struct Elev { char nume[21]; double medie; };

int main() {
    Elev v[100], aux;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> v[i].nume >> v[i].medie;
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++) {
            bool schimb = false;
            if (v[j].medie < v[j+1].medie) schimb = true;
            else if (v[j].medie == v[j+1].medie && strcmp(v[j].nume, v[j+1].nume) > 0) schimb = true;
            if (schimb) { aux = v[j]; v[j] = v[j+1]; v[j+1] = aux; }
        }
    for (int i = 0; i < n; i++)
        cout << v[i].nume << " " << v[i].medie << "\n";
    return 0;
}
```

Pentru intrarea: Ana 9.5, Dan 9.75, Barbu 9.5 → ieșirea: Dan 9.75, **Ana** 9.5, **Barbu** 9.5 (egalitate rezolvată alfabetic) ✓.

## Cheia: condiția de interschimbare

Cele două criterii se combină EXACT așa:

1. criteriul 1 strict (medie mai mică înaintea uneia mai mari la sortare descrescătoare) → schimbi;
2. criteriul 1 EGAL și criteriul 2 încălcat (strcmp > 0 = ordine alfabetică greșită) → schimbi;
3. altfel nu schimbi.

Interschimbarea copiază STRUCTURA ÎNTREAGĂ (`aux = v[j]`): numele și media călătoresc împreună: exact avantajul struct-ului față de doi vectori paraleli.

## Varianta cu vectori paraleli (de recunoscut)

Unele subiecte folosesc `nume[100][21]` + `medie[100]`: la interschimbare trebuie schimbate AMBELE (numele cu strcpy prin buffer). Orice câmp uitat = date "amestecate": eroarea clasică pe care subiectele o exploatează.

> [!RETINE]
> Departajarea: else if (criteriu1 EGAL && criteriu2 gresit). Cu struct, interschimbarea e o singură atribuire pe element: motivul real pentru care struct-ul exista în programă.

## Greșeli frecvente

1. Compararea numelor cu > direct nu compilează pe char[]: obligatoriu strcmp.
2. La medii egale FĂRĂ departajare explicită, ordinea rămâne cea din citire: dacă subiectul cere alfabetic, condiția a doua e obligatorie.
3. bubble sort pe struct: limita interioară tot n-i-1 rămâne.
