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

Sortarea vectorilor de structuri

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

Conținut verificat

Problema-tip

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

Soluția completă

#include <iostream>
#include <cstring>
using namespace std;

struct Elev {
    char nume[20];
    int nota;
};

int main() {
    Elev e[4] = {{"Bogdan", 9}, {"Ana", 9}, {"Dan", 7}, {"Carmen", 8}};
    int n = 4;

    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++) {
            bool schimb = e[j].nota < e[j + 1].nota ||
                          (e[j].nota == e[j + 1].nota && strcmp(e[j].nume, e[j + 1].nume) > 0);
            if (schimb) {
                Elev aux = e[j]; e[j] = e[j + 1]; e[j + 1] = aux;
            }
        }

    for (int i = 0; i < n; i++)
        cout << e[i].nume << " " << e[i].nota << "\n";
    return 0;
}

Atenție: Cheia lectiei e departajarea: doi elevi cu aceeasi nota se ordoneaza alfabetic. De aceea conditia de interschimbare are doua parti, legate prin SAU.

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ă.

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.
EXPLOREAZĂ INTERACTIV