Tematică științifică · 1.6
Algoritmi de sortare
Metoda bulelor, sortarea prin inserție, prin selecție și prin numărare, cu funcționarea fiecărei metode, exemplul lucrat pas cu pas, implementarea în pseudocod, C++ și Python, ordinul de complexitate și criteriile de alegere.
Programa prevede următoarele metode:
- metoda bulelor;
- sortarea prin inserție;
- sortarea prin selecție;
- sortarea prin numărare.
Primele trei ordonează elementele comparându-le între ele. A patra nu efectuează comparații între elemente și se poate aplica numai valorilor întregi dintr-un interval cunoscut și mic.
Toate exemplele de mai jos ordonează crescător.
Metoda bulelor
Cum funcționează algoritmul
- Tabloul se parcurge de la primul element spre ultimul.
- Se compară fiecare element cu vecinul lui din dreapta.
- Perechile care nu se află în ordinea cerută se interschimbă.
- La sfârșitul unei parcurgeri, cel mai mare element din partea neordonată ajunge pe ultima ei poziție.
- Parcurgerile se reiau cât timp în cea dinainte s-a făcut cel puțin o interschimbare.
Numele metodei vine de la felul în care elementele cu valori mari înaintează spre sfârșitul tabloului la fiecare parcurgere, asemenea bulelor de aer care se ridică la suprafața apei.
Pașii algoritmului
| Pasul | Ce se execută |
|---|---|
| Pas 1. | Se inițializează pana ← n - 1, adică numărul de perechi de vecini care se compară în prima parcurgere. |
| Pas 2. | Începe o parcurgere: schimbat ← fals și i ← 1. |
| Pas 3. | Dacă i ≤ pana, se merge la Pas 4; altfel, se merge la Pas 6. |
| Pas 4. | Dacă v[i] > v[i+1], cele două elemente se interschimbă și schimbat ← adevărat. |
| Pas 5. | i ← i + 1. Se revine la Pas 3. |
| Pas 6. | Parcurgerea s-a încheiat, iar cel mai mare element din partea neordonată a ajuns pe ultima ei poziție: pana ← pana - 1. |
| Pas 7. | Dacă schimbat = adevărat, se revine la Pas 2; altfel, tabloul este ordonat și algoritmul se încheie. |
Algoritm
bule(v, n):
pana ← n - 1
repetă
schimbat ← fals
pentru i ← 1, pana execută
dacă v[i] > v[i+1] atunci
interschimbă v[i] cu v[i+1]
schimbat ← adevărat
sfdacă
sfpentru
pana ← pana - 1
până când schimbat = fals
C++
void bule(int v[], int n) {
bool schimbat;
int pana = n - 1;
do {
schimbat = false;
for (int i = 0; i < pana; i++)
if (v[i] > v[i + 1]) {
swap(v[i], v[i + 1]);
schimbat = true;
}
pana--;
} while (schimbat);
}
Python
def bule(v):
pana = len(v) - 1
schimbat = True
while schimbat:
schimbat = False
for i in range(pana):
if v[i] > v[i + 1]:
v[i], v[i + 1] = v[i + 1], v[i]
schimbat = True
pana -= 1
Variabila pana scade cu o unitate după fiecare parcurgere: ultimele elemente se află deja pe
pozițiile lor definitive, iar compararea lor din nou nu ar schimba nimic.
În Python, interschimbarea se scrie într-o singură atribuire, v[i], v[i+1] = v[i+1], v[i], fără
variabilă ajutătoare. În C++, aceeași operație cere funcția swap sau o a treia variabilă.
Exemplu. Tabloul 5, 1, 4, 2.
| Parcurgerea | Comparațiile | Tabloul la sfârșit |
|---|---|---|
| 1 | (5,1) interschimbare · (5,4) interschimbare · (5,2) interschimbare | 1 4 2 5 |
| 2 | (1,4) fără · (4,2) interschimbare | 1 2 4 5 |
| 3 | (1,2) fără | 1 2 4 5, nicio interschimbare, algoritmul se oprește |
Observație. Variabila schimbat face metoda eficientă pe date aproape ordonate. Pe un tablou
deja sortat, algoritmul efectuează o singură parcurgere și se oprește. Fără această variabilă,
numărul de parcurgeri ar fi întotdeauna același, oricât de ordonate ar fi datele.
Sortarea prin inserție
Cum funcționează algoritmul
- Tabloul se împarte în două părți: una ordonată, la început, și una neordonată.
- La început, partea ordonată cuprinde numai primul element.
- Se ia primul element din partea neordonată și se păstrează într-o variabilă.
- Elementele din partea ordonată mai mari decât el se deplasează cu o poziție spre dreapta.
- Elementul se așază pe locul rămas liber.
- Pașii se repetă până când partea neordonată rămâne vidă.
Pașii algoritmului
| Pasul | Ce se execută |
|---|---|
| Pas 1. | Se inițializează i ← 2: partea ordonată cuprinde deocamdată numai primul element. |
| Pas 2. | Dacă i ≤ n, se merge la Pas 3; altfel, tabloul este ordonat și algoritmul se încheie. |
| Pas 3. | Se păstrează elementul care urmează să fie inserat: x ← v[i]. Se inițializează j ← i - 1. |
| Pas 4. | Dacă j ≥ 1 și v[j] > x, se merge la Pas 5; altfel, se merge la Pas 6. |
| Pas 5. | Elementul se deplasează cu o poziție spre dreapta: v[j+1] ← v[j] și j ← j - 1. Se revine la Pas 4. |
| Pas 6. | Elementul păstrat se așază pe locul rămas liber: v[j+1] ← x. |
| Pas 7. | i ← i + 1. Se revine la Pas 2. |
Algoritm
insertie(v, n):
pentru i ← 2, n execută
x ← v[i]
j ← i - 1
cât timp j ≥ 1 și v[j] > x execută
v[j+1] ← v[j]
j ← j - 1
sfcât timp
v[j+1] ← x
sfpentru
C++
void insertie(int v[], int n) {
for (int i = 1; i < n; i++) {
int x = v[i];
int j = i - 1;
while (j >= 0 && v[j] > x) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = x;
}
}
Python
def insertie(v):
for i in range(1, len(v)):
x = v[i]
j = i - 1
while j >= 0 and v[j] > x:
v[j + 1] = v[j]
j -= 1
v[j + 1] = x
Exemplu. Tabloul 5, 1, 4, 2. Bara verticală arată hotarul dintre partea ordonată și cea neordonată.
| Pasul | Elementul inserat | Tabloul |
|---|---|---|
| pornire | — | 5 │ 1 4 2 |
| 1 | 1 | 1 5 │ 4 2 |
| 2 | 4 | 1 4 5 │ 2 |
| 3 | 2 | 1 2 4 5 │ |
Observație. Pe date aproape ordonate, fiecare element își găsește locul din una sau două comparații. Din acest motiv, metoda se folosește ca ultimă etapă în algoritmii de sortare eficienți, pentru subsecvențele scurte.
Ordonarea pe măsura citirii. Aceeași inserare se poate face chiar în timpul citirii: fiecare valoare nouă se așază pe locul ei între valorile citite până atunci, care formează deja un vector ordonat. După ultima citire, vectorul este ordonat.
C++
int n, v[100], x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
int j = i;
while (j > 0 && v[j - 1] > x) {
v[j] = v[j - 1];
j--;
}
v[j] = x;
}
Python
n = int(input())
v = []
for i in range(n):
x = int(input())
j = len(v)
v.append(x)
while j > 0 and v[j - 1] > x:
v[j] = v[j - 1]
j -= 1
v[j] = x
Sortarea prin selecție
Cum funcționează algoritmul
- Tabloul se împarte tot în parte ordonată și parte neordonată, dar partea ordonată este la început vidă.
- Se caută poziția celui mai mic element din partea neordonată.
- Acesta se interschimbă cu primul element al părții neordonate.
- Elementul ajunge astfel la locul lui definitiv și trece în partea ordonată.
- Pașii se repetă până când în partea neordonată rămâne un singur element.
Pașii algoritmului
| Pasul | Ce se execută |
|---|---|
| Pas 1. | Se inițializează i ← 1: partea neordonată începe cu primul element. |
| Pas 2. | Dacă i ≤ n - 1, se merge la Pas 3; altfel, tabloul este ordonat și algoritmul se încheie. |
| Pas 3. | Se presupune că minimul se află pe prima poziție a părții neordonate: poz ← i. Se inițializează j ← i + 1. |
| Pas 4. | Dacă j ≤ n, se merge la Pas 5; altfel, se merge la Pas 7. |
| Pas 5. | Dacă v[j] < v[poz], se reține noua poziție a minimului: poz ← j. |
| Pas 6. | j ← j + 1. Se revine la Pas 4. |
| Pas 7. | Dacă poz ≠ i, elementele v[i] și v[poz] se interschimbă. Poziția i este acum definitivă. |
| Pas 8. | i ← i + 1. Se revine la Pas 2. |
Materialul acesta se citește pe educamp.ro și nu se tipărește.
S-a încheiat minutul de citit liber.
Ce cuprinde subcapitolul
- Metoda bulelor
- Sortarea prin inserție
- Sortarea prin selecție
- Sortarea prin numărare
- Comparația metodelor
- Alegerea metodei
- Apariții la examen
Continuă lectura ca și cursant
Cel puțin un subcapitol din fiecare capitol este disponibil gratuit și integral. Pentru a citi toate celelalte subcapitole ale disciplinei, te înscrii la cursul de pregătire.
Te înscrii, alegi în cont când începe cursul și plătești prima lună prin transfer bancar. Pentru a vedea mai întâi cum este prezentată materia, poți reveni la primul subcapitol al capitolului.
Acces la suportul de curs
25 RON / lună, fără ședințe
Ce cuprinde:
- Acces la toate lecțiile disponibile
- Suport de curs pentru tematica științifică și metodică
- Exemple, explicații și exerciții
- Acces la materialele noi adăugate pe platformă
- Posibilitatea de a adresa întrebări
Poți alege și variante cu ședințe online, în grup sau individuale. Le vezi pe pagina cursului.
Ai întrebări sau o problemă? Scrie-mi pe WhatsApp, la 0745 874 576.
Surse (4)
- Cerchez, E., Șerban, M., „Programarea în limbajul C/C++ pentru liceu”, Editura Polirom, Iași, 2005
- „Metode și tehnici clasice de programare”, suport de curs
- „Informatică. Manual pentru clasa a XI-a”, Editura Didactică și Pedagogică, București
- Huțanu, V., Tudor, S., „Informatică. Manual pentru clasa a XI-a”, Editura L&S Soft, București, 2006