Sortarea Elementelor unui Vector: Arta de a Aranja În Ordine – Materie BAC

Bun, hai să vorbim despre una dintre cele mai importante operații cu vectori: SORTAREA. Nu e doar despre aranjare (cuvânt plictisitor) și ordine. E despre cum transformi o grămadă dezordonată de numere într-o listă perfect organizată. E o operație atât de fundamentală încât dacă ar fi să cauți ceva într-o listă nesortată, ai căuta ca orbul în ceață. Dar aici intervine și partea strategică: alegerea algoritmului de sortare potrivit pentru situația ta.

1. De ce Să Sortăm? “Căutarea Cheilor în Întuneric vs cu Lanternă”

Gândește-te la sortare ca la aranjarea cărților în bibliotecă în ordine alfabetică: în loc să cauți o carte mergând prin toată biblioteca, mergi direct la raftul potrivit.

De ce sortăm vectorii?

  1. Căutarea devine rapidă – poți folosi căutarea binară
  2. Datele sunt mai lizibile – vezi imediat min, max, mediană
  3. Pregătește pentru alte operații – unirea a doi vectori sortați e ușoară
  4. E necesară pentru multe algoritme – statistici, grafice, baze de date

Analogie cu un pachet de cărți de joc:

Fără sortare: “Vreau un 7 de cupă” → cauți prin toate cărțile una câte una
Cu sortare: cărțile sunt aranjate pe culori și valori → găsești imediat

2. Bubble Sort: “Cel Mai Simplu, Dar Cel Mai Lent”

Cum funcționează: Compară două elemente vecine, le schimbă dacă sunt în ordine greșită, repetă până când tot vectorul e sortat. Ca bulele care urcă în suprafața apei.

#include <iostream>
using namespace std;

int main() {
    int v[] = {64, 34, 25, 12, 22, 11, 90};
    int n = 7;  // Numărul de elemente

    cout << "Vector nesortat: ";
    for(int i = 0; i < n; i++) {
        cout << v[i] << " ";
    }
    cout << endl;

    // Bubble Sort - versiunea simplă
    for(int i = 0; i < n - 1; i++) {          // Trecem prin vector de n-1 ori
        for(int j = 0; j < n - i - 1; j++) {  // Ultimele i elemente sunt deja sortate
            if(v[j] > v[j + 1]) {             // Dacă sunt în ordine greșită
                // Schimbă elementele
                int temp = v[j];
                v[j] = v[j + 1];
                v[j + 1] = temp;
            }
        }

        // Afișează starea după fiecare trecere (pentru vizualizare)
        cout << "Dupa trecerea " << i + 1 << ": ";
        for(int k = 0; k < n; k++) {
            cout << v[k] << " ";
        }
        cout << endl;
    }

    cout << "\nVector sortat crescator: ";
    for(int i = 0; i < n; i++) {
        cout << v[i] << " ";
    }
    cout << endl;

    return 0;
}

Ce se întâmplă pas cu pas:

Vector initial: 64 34 25 12 22 11 90

Trecerea 1: Schimbă 64 cu 34, 64 cu 25, 64 cu 12, 64 cu 22, 64 cu 11
Rezultat: 34 25 12 22 11 64 90  (64 și 90 la locul lor)

Trecerea 2: Schimbă 34 cu 25, 34 cu 12, 34 cu 22, 34 cu 11
Rezultat: 25 12 22 11 34 64 90  (34 la locul lui)

Trecerea 3: Schimbă 25 cu 12, 25 cu 22, 25 cu 11
Rezultat: 12 22 11 25 34 64 90  (25 la locul lui)

... și așa mai departe până tot vectorul e sortat

Optimizare pentru Bubble Sort:

#include <iostream>
using namespace std;

int main() {
    int v[] = {1, 2, 3, 4, 5, 6, 7};  // Deja sortat!
    int n = 7;

    // Bubble Sort optimizat - se oprește dacă vectorul e deja sortat
    bool schimbat;

    for(int i = 0; i < n - 1; i++) {
        schimbat = false;  // Presupunem că nu s-a făcut niciun schimb

        for(int j = 0; j < n - i - 1; j++) {
            if(v[j] > v[j + 1]) {
                int temp = v[j];
                v[j] = v[j + 1];
                v[j + 1] = temp;
                schimbat = true;  // S-a făcut cel puțin un schimb
            }
        }

        // Dacă nu s-a făcut niciun schimb, vectorul e sortat
        if(!schimbat) {
            cout << "Vectorul a fost sortat dupa " << i + 1 << " treceri" << endl;
            break;
        }
    }

    return 0;
}

3. Selection Sort: “Găsește Minimul și Pune-l la Început”

Cum funcționează: Găsește cel mai mic element, îl pune pe prima poziție. Apoi găsește următorul cel mai mic din rest, îl pune pe a doua poziție, etc.

#include <iostream>
using namespace std;

int main() {
    int v[] = {64, 25, 12, 22, 11};
    int n = 5;

    cout << "Vector nesortat: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Selection Sort
    for(int i = 0; i < n - 1; i++) {
        // Găsește poziția minimului în partea nesortată (de la i la sfârșit)
        int pozitieMinim = i;

        for(int j = i + 1; j < n; j++) {
            if(v[j] < v[pozitieMinim]) {
                pozitieMinim = j;  // Am găsit un element mai mic
            }
        }

        // Schimbă elementul minim cu primul element din partea nesortată
        if(pozitieMinim != i) {  // Dacă minimul nu e deja pe poziția i
            int temp = v[i];
            v[i] = v[pozitieMinim];
            v[pozitieMinim] = temp;
        }

        // Afișează progresul
        cout << "Dupa pasul " << i + 1 << " (minimul pus pe pozitia " << i << "): ";
        for(int k = 0; k < n; k++) cout << v[k] << " ";
        cout << endl;
    }

    cout << "\nVector sortat crescator: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    return 0;
}

Ce se întâmplă pas cu pas:

Vector initial: 64 25 12 22 11

Pasul 1: Găsește minimul (11) și îl pune pe poziția 0
Schimbă 64 cu 11 → 11 25 12 22 64

Pasul 2: Găsește minimul în rest (12) și îl pune pe poziția 1
Schimbă 25 cu 12 → 11 12 25 22 64

Pasul 3: Găsește minimul în rest (22) și îl pune pe poziția 2
Schimbă 25 cu 22 → 11 12 22 25 64

Pasul 4: Ultimele două sunt deja în ordine
Rezultat final: 11 12 22 25 64

4. Insertion Sort: “Ca Să Înșurubezi un Șurub”

Cum funcționează: Luați un element, inserați-l în poziția corectă în partea deja sortată. Ca și cum ai sorta cărți de joc în mână.

#include <iostream>
using namespace std;

int main() {
    int v[] = {12, 11, 13, 5, 6};
    int n = 5;

    cout << "Vector nesortat: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Insertion Sort
    for(int i = 1; i < n; i++) {  // Începe cu al doilea element
        int elementCurent = v[i];  // Elementul pe care vrem să-l inserăm
        int j = i - 1;             // Ultimul element din partea sortată

        // Mută elementele mai mari decât elementCurent cu o poziție la dreapta
        while(j >= 0 && v[j] > elementCurent) {
            v[j + 1] = v[j];  // Mută elementul mai mare
            j = j - 1;        // Mergi înapoi în partea sortată
        }

        // Inserează elementCurent în poziția corectă
        v[j + 1] = elementCurent;

        // Afișează progresul
        cout << "Dupa pasul " << i << " (elementul " << elementCurent << " inserat): ";
        for(int k = 0; k < n; k++) cout << v[k] << " ";
        cout << endl;
    }

    cout << "\nVector sortat crescator: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    return 0;
}

Ce se întâmplă pas cu pas:

Vector initial: 12 11 13 5 6

Pasul 1: Luați 11, inserați-l înainte de 12
11 12 13 5 6

Pasul 2: Luați 13, e deja în poziția corectă (după 12)
11 12 13 5 6

Pasul 3: Luați 5, inserați-l înaintea tuturor
5 11 12 13 6

Pasul 4: Luați 6, inserați-l între 5 și 11
5 6 11 12 13

5. Compararea Algoritmilor: “Care e Cel Mai Bun?”

#include <iostream>
using namespace std;

int main() {
    cout << "=== COMPARATIE ALGORITMI DE SORTARE ===\n\n";

    cout << "BUBBLE SORT:\n";
    cout << "- Cum functioneaza: Compara vecinii si-i schimba daca sunt gresit\n";
    cout << "- Complexitate: O(n²) în cel mai rău caz\n";
    cout << "- Cand il folosesti: Pentru vectori mici sau aproape sortati\n";
    cout << "- Avantaje: Simplu de inteles si implementat\n";
    cout << "- Dezavantaje: Foarte lent pentru vectori mari\n\n";

    cout << "SELECTION SORT:\n";
    cout << "- Cum functioneaza: Gaseste minimul si-l pune la inceput\n";
    cout << "- Complexitate: O(n²) întotdeauna\n";
    cout << "- Cand il folosesti: Cand vrei putine schimbari (ex: sortare flash-uri)\n";
    cout << "- Avantaje: Face doar O(n) schimburi\n";
    cout << "- Dezavantaje: Tot O(n²) comparatii\n\n";

    cout << "INSERTION SORT:\n";
    cout << "- Cum functioneaza: Insereaza fiecare element in pozitia corecta\n";
    cout << "- Complexitate: O(n²) în cel mai rău caz, O(n) dacă e aproape sortat\n";
    cout << "- Cand il folosesti: Pentru vectori mici sau aproape sortati\n";
    cout << "- Avantaje: Bun pentru date care vin în flux (online sorting)\n";
    cout << "- Dezavantaje: Lent pentru vectori mari invers sortati\n";

    return 0;
}

6. Sortare Descrescătoare: “Doar Schimbi Semnul”

#include <iostream>
using namespace std;

int main() {
    int v[] = {5, 2, 8, 1, 9, 3};
    int n = 6;

    cout << "Vector initial: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Bubble Sort descrescator (schimba doar conditia!)
    for(int i = 0; i < n - 1; i++) {
        for(int j = 0; j < n - i - 1; j++) {
            if(v[j] < v[j + 1]) {  // < în loc de >
                int temp = v[j];
                v[j] = v[j + 1];
                v[j + 1] = temp;
            }
        }
    }

    cout << "Vector sortat descrescator: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Selection Sort descrescator (găsește maximul, nu minimul)
    int v2[] = {5, 2, 8, 1, 9, 3};

    for(int i = 0; i < n - 1; i++) {
        int pozitieMaxim = i;

        for(int j = i + 1; j < n; j++) {
            if(v2[j] > v2[pozitieMaxim]) {  // > în loc de <
                pozitieMaxim = j;
            }
        }

        if(pozitieMaxim != i) {
            int temp = v2[i];
            v2[i] = v2[pozitieMaxim];
            v2[pozitieMaxim] = temp;
        }
    }

    cout << "Vector sortat descrescator (Selection): ";
    for(int i = 0; i < n; i++) cout << v2[i] << " ";
    cout << endl;

    return 0;
}

7. Sortarea Unui Vector Citit de la Tastatură

#include <iostream>
using namespace std;

int main() {
    const int MAX = 100;
    int v[MAX];
    int n;

    cout << "Cate numere vrei sa sortezi? (max " << MAX << "): ";
    cin >> n;

    if(n <= 0 || n > MAX) {
        cout << "Numar invalid!" << endl;
        return 1;
    }

    // Citire vector
    cout << "Introdu " << n << " numere:" << endl;
    for(int i = 0; i < n; i++) {
        cout << "v[" << i << "] = ";
        cin >> v[i];
    }

    cout << "\nVector inainte de sortare: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Alegerea algoritmului
    int alegere;
    cout << "\nAlege algoritmul de sortare:\n";
    cout << "1. Bubble Sort\n";
    cout << "2. Selection Sort\n";
    cout << "3. Insertion Sort\n";
    cout << "Alegerea ta: ";
    cin >> alegere;

    // Sortare după alegere
    switch(alegere) {
        case 1:  // Bubble Sort
            for(int i = 0; i < n - 1; i++) {
                for(int j = 0; j < n - i - 1; j++) {
                    if(v[j] > v[j + 1]) {
                        int temp = v[j];
                        v[j] = v[j + 1];
                        v[j + 1] = temp;
                    }
                }
            }
            cout << "Am folosit Bubble Sort\n";
            break;

        case 2:  // Selection Sort
            for(int i = 0; i < n - 1; i++) {
                int minIdx = i;
                for(int j = i + 1; j < n; j++) {
                    if(v[j] < v[minIdx]) {
                        minIdx = j;
                    }
                }
                if(minIdx != i) {
                    int temp = v[i];
                    v[i] = v[minIdx];
                    v[minIdx] = temp;
                }
            }
            cout << "Am folosit Selection Sort\n";
            break;

        case 3:  // Insertion Sort
            for(int i = 1; i < n; i++) {
                int key = v[i];
                int j = i - 1;
                while(j >= 0 && v[j] > key) {
                    v[j + 1] = v[j];
                    j--;
                }
                v[j + 1] = key;
            }
            cout << "Am folosit Insertion Sort\n";
            break;

        default:
            cout << "Alegere invalida! Nu s-a sortat nimic.\n";
    }

    cout << "\nVector dupa sortare: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    return 0;
}

8. Probleme Practice cu Sortarea

Problema 1: Sortare după Ultima Cifră

#include <iostream>
using namespace std;

int main() {
    int v[] = {123, 45, 789, 12, 6, 98, 345};
    int n = 7;

    cout << "Vector initial: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Bubble Sort care compară ultima cifră
    for(int i = 0; i < n - 1; i++) {
        for(int j = 0; j < n - i - 1; j++) {
            // Compară ultima cifră (v[j] % 10)
            if(v[j] % 10 > v[j + 1] % 10) {
                int temp = v[j];
                v[j] = v[j + 1];
                v[j + 1] = temp;
            }
        }
    }

    cout << "Sortat dupa ultima cifra: ";
    for(int i = 0; i < n; i++) {
        cout << v[i] << "(" << v[i] % 10 << ") ";
    }
    cout << endl;

    return 0;
}

Problema 2: Sortare Alternativă (Min-Max)

#include <iostream>
using namespace std;

int main() {
    int v[] = {7, 2, 9, 4, 1, 8, 5, 3, 6};
    int n = 9;

    cout << "Vector initial: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Sortare specială: primul minim, apoi maxim, apoi al doilea minim, etc.

    // Mai întâi sortăm normal
    for(int i = 0; i < n - 1; i++) {
        for(int j = 0; j < n - i - 1; j++) {
            if(v[j] > v[j + 1]) {
                int temp = v[j];
                v[j] = v[j + 1];
                v[j + 1] = temp;
            }
        }
    }

    cout << "Vector sortat normal: ";
    for(int i = 0; i < n; i++) cout << v[i] << " ";
    cout << endl;

    // Acum creăm un vector nou cu aranjament min-max
    int rezultat[9];
    int stanga = 0, dreapta = n - 1;

    for(int i = 0; i < n; i++) {
        if(i % 2 == 0) {  // Poziții pare: ia din stânga (minime)
            rezultat[i] = v[stanga];
            stanga++;
        } else {          // Poziții impare: ia din dreapta (maxime)
            rezultat[i] = v[dreapta];
            dreapta--;
        }
    }

    cout << "Sortat min-max alternativ: ";
    for(int i = 0; i < n; i++) cout << rezultat[i] << " ";
    cout << endl;

    return 0;
}

Problema 3: Sortare după Mai Multe Criterii

#include <iostream>
using namespace std;

int main() {
    // Vector de perechi (nota, număr de absențe)
    int note[] = {9, 7, 10, 5, 8};
    int absente[] = {2, 5, 1, 10, 3};
    int n = 5;

    cout << "Elevi inainte de sortare:\n";
    cout << "Nota | Absente\n";
    for(int i = 0; i < n; i++) {
        cout << note[i] << "    | " << absente[i] << endl;
    }

    // Sortare după notă descrescător, apoi după absențe crescător
    // (elevii cu note mai mari și mai puține absențe primele)

    for(int i = 0; i < n - 1; i++) {
        for(int j = 0; j < n - i - 1; j++) {
            bool schimba = false;

            // Criteriul 1: Nota mai mare e mai bun
            if(note[j] < note[j + 1]) {
                schimba = true;
            }
            // Criteriul 2: Dacă notele sunt egale, mai puține absențe e mai bun
            else if(note[j] == note[j + 1] && absente[j] > absente[j + 1]) {
                schimba = true;
            }

            if(schimba) {
                // Schimbă notele
                int tempNota = note[j];
                note[j] = note[j + 1];
                note[j + 1] = tempNota;

                // Schimbă absențele (menține corespondența)
                int tempAbs = absente[j];
                absente[j] = absente[j + 1];
                absente[j + 1] = tempAbs;
            }
        }
    }

    cout << "\nElevi dupa sortare (nota desc, absente cresc):\n";
    cout << "Nota | Absente\n";
    for(int i = 0; i < n; i++) {
        cout << note[i] << "    | " << absente[i] << endl;
    }

    return 0;
}

9. Algoritmi Avansați (Conceptual)

#include <iostream>
using namespace std;

int main() {
    cout << "=== ALGORITMI AVANSATI DE SORTARE (teoretic) ===\n\n";

    cout << "QUICK SORT:\n";
    cout << "- Cum functioneaza: Alege un 'pivot', muta elementele mai mici in stanga,\n";
    cout << "  mai mari in dreapta, aplica recursiv pe cele doua jumatati\n";
    cout << "- Complexitate: O(n log n) în medie, O(n²) în cel mai rău caz\n";
    cout << "- Cand il folosesti: Pentru vectori mari, cel mai folosit în practică\n";
    cout << "- Avantaje: Foarte rapid în practică, sortare în loc (nu folosește memorie extra)\n\n";

    cout << "MERGE SORT:\n";
    cout << "- Cum functioneaza: Împarte vectorul în jumătăți până când ai elemente singure,\n";
    cout << "  apoi le reunește în ordine\n";
    cout << "- Complexitate: O(n log n) întotdeauna\n";
    cout << "- Cand il folosesti: Când ai nevoie de performanță garantată O(n log n)\n";
    cout << "- Avantaje: Performanță stabilă, bun pentru liste înlănțuite\n";
    cout << "- Dezavantaje: Folosește memorie extra\n\n";

    cout << "HEAP SORT:\n";
    cout << "- Cum functioneaza: Construiește un heap (arbore binar), extrage rădăcina (maximul)\n";
    cout << "  repetat până se golește heap-ul\n";
    cout << "- Complexitate: O(n log n) întotdeauna\n";
    cout << "- Cand il folosesti: Când vrei O(n log n) garantat și memorie limitată\n";
    cout << "- Avantaje: Nu folosește memorie extra, performanță garantată\n";

    return 0;
}

10. PROIECT INTEGRAT: Sistem de Sortare Complet

#include <iostream>
using namespace std;

// Funcții pentru diferite tipuri de sortări
void bubbleSort(int v[], int n) {
    for(int i = 0; i < n - 1; i++) {
        for(int j = 0; j < n - i - 1; j++) {
            if(v[j] > v[j + 1]) {
                int temp = v[j];
                v[j] = v[j + 1];
                v[j + 1] = temp;
            }
        }
    }
}

void selectionSort(int v[], int n) {
    for(int i = 0; i < n - 1; i++) {
        int minIdx = i;
        for(int j = i + 1; j < n; j++) {
            if(v[j] < v[minIdx]) {
                minIdx = j;
            }
        }
        if(minIdx != i) {
            int temp = v[i];
            v[i] = v[minIdx];
            v[minIdx] = temp;
        }
    }
}

void insertionSort(int v[], int n) {
    for(int i = 1; i < n; i++) {
        int key = v[i];
        int j = i - 1;
        while(j >= 0 && v[j] > key) {
            v[j + 1] = v[j];
            j--;
        }
        v[j + 1] = key;
    }
}

void afiseazaVector(int v[], int n, string mesaj) {
    cout << mesaj;
    for(int i = 0; i < n; i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}

int main() {
    const int MAX = 50;
    int vector[MAX], copie[MAX];
    int n;

    cout << "=== SISTEM COMPLET DE SORTARE ===\n\n";

    // Citire dimensiune
    cout << "Cate numere vrei sa sortezi? (max " << MAX << "): ";
    cin >> n;

    if(n <= 0 || n > MAX) {
        cout << "Dimensiune invalida!" << endl;
        return 1;
    }

    // Generare sau citire numere
    int optiuneGenerare;
    cout << "\nCum vrei sa introduci numerele?\n";
    cout << "1. Manual (de la tastatura)\n";
    cout << "2. Automat (numere aleatoare)\n";
    cout << "Alegerea ta: ";
    cin >> optiuneGenerare;

    if(optiuneGenerare == 1) {
        cout << "Introdu " << n << " numere:\n";
        for(int i = 0; i < n; i++) {
            cout << "Numarul " << i+1 << ": ";
            cin >> vector[i];
        }
    } else {
        // Generare numere aleatoare între 1 și 100
        cout << "Generam " << n << " numere aleatoare intre 1 si 100...\n";
        for(int i = 0; i < n; i++) {
            vector[i] = rand() % 100 + 1;
        }
    }

    // Salvare copie pentru a testa fiecare algoritm pe aceleași date
    for(int i = 0; i < n; i++) {
        copie[i] = vector[i];
    }

    afiseazaVector(vector, n, "\nVector inainte de sortare: ");

    // Meniu algoritmi
    cout << "\n=== ALGORITMI DISPONIBILI ===\n";
    cout << "1. Bubble Sort\n";
    cout << "2. Selection Sort\n";
    cout << "3. Insertion Sort\n";
    cout << "4. Toate (comparatie)\n";
    cout << "Alegerea ta: ";

    int alegere;
    cin >> alegere;

    switch(alegere) {
        case 1:
            bubbleSort(vector, n);
            afiseazaVector(vector, n, "\nRezultat Bubble Sort: ");
            break;

        case 2:
            selectionSort(vector, n);
            afiseazaVector(vector, n, "\nRezultat Selection Sort: ");
            break;

        case 3:
            insertionSort(vector, n);
            afiseazaVector(vector, n, "\nRezultat Insertion Sort: ");
            break;

        case 4:
            // Testează toate algoritmle pe aceleași date
            cout << "\n=== COMPARATIE ALGORITMI ===\n";

            // Bubble Sort
            for(int i = 0; i < n; i++) vector[i] = copie[i];
            bubbleSort(vector, n);
            afiseazaVector(vector, n, "Bubble Sort:    ");

            // Selection Sort
            for(int i = 0; i < n; i++) vector[i] = copie[i];
            selectionSort(vector, n);
            afiseazaVector(vector, n, "Selection Sort: ");

            // Insertion Sort
            for(int i = 0; i < n; i++) vector[i] = copie[i];
            insertionSort(vector, n);
            afiseazaVector(vector, n, "Insertion Sort: ");
            break;

        default:
            cout << "Alegere invalida!" << endl;
    }

    // Verificare dacă vectorul e sortat corect
    bool sortatCorect = true;
    for(int i = 0; i < n - 1; i++) {
        if(vector[i] > vector[i + 1]) {
            sortatCorect = false;
            break;
        }
    }

    if(sortatCorect) {
        cout << "\n✓ Vectorul a fost sortat CORECT (crescator)!" << endl;
    } else {
        cout << "\n✗ Vectorul NU este sortat corect!" << endl;
    }

    // Opțiuni suplimentare
    cout << "\n=== OPȚIUNI SUPLIMENTARE ===\n";
    cout << "1. Afiseaza elementul minim si maxim\n";
    cout << "2. Afiseaza mediana\n";
    cout << "3. Cauta un element in vectorul sortat\n";
    cout << "4. Iesire\n";
    cout << "Alegerea ta: ";

    int optiuneSuplimentara;
    cin >> optiuneSuplimentara;

    switch(optiuneSuplimentara) {
        case 1:
            cout << "\nMinim: " << vector[0] << endl;
            cout << "Maxim: " << vector[n-1] << endl;
            break;

        case 2:
            if(n % 2 == 1) {
                cout << "\nMediana: " << vector[n/2] << endl;
            } else {
                cout << "\nMediana: (" << vector[n/2 - 1] << " + " << vector[n/2] 
                     << ") / 2 = " << (vector[n/2 - 1] + vector[n/2]) / 2.0 << endl;
            }
            break;

        case 3:
            int elementCautat;
            cout << "\nCe element cauti? ";
            cin >> elementCautat;

            // Căutare binară (rapidă în vector sortat!)
            int stanga = 0, dreapta = n - 1;
            bool gasit = false;
            int pasi = 0;

            while(stanga <= dreapta && !gasit) {
                pasi++;
                int mijloc = (stanga + dreapta) / 2;

                if(vector[mijloc] == elementCautat) {
                    gasit = true;
                    cout << "Elementul " << elementCautat << " a fost gasit pe pozitia " 
                         << mijloc << endl;
                } else if(vector[mijloc] < elementCautat) {
                    stanga = mijloc + 1;
                } else {
                    dreapta = mijloc - 1;
                }
            }

            if(!gasit) {
                cout << "Elementul " << elementCautat << " NU a fost gasit in vector!" << endl;
            }
            cout << "Cautarea a durat " << pasi << " pasi (binara vs " << n << " pasi liniara)" << endl;
            break;
    }

    cout << "\nLa revedere!" << endl;
    return 0;
}

În concluzie, să-ți spun ceva fundamental:

Sortarea nu e doar o operație tehnică – e o unealtă fundamentală care transformă datele dezorganizate în informație utilă.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *