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?
- Căutarea devine rapidă – poți folosi căutarea binară
- Datele sunt mai lizibile – vezi imediat min, max, mediană
- Pregătește pentru alte operații – unirea a doi vectori sortați e ușoară
- 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ă.
Leave a Reply