Sunteți pe pagina 1din 4

TEMA 4

Metode de sortare: SelectionSort și BubbleSort

METODA SELECTIONSORT

Sortarea prin selecție (Selection Sort) se bazează pe următoarea idee:


 fie un vector X[] cu n elemente;
 plasăm în X[0] cea mai mică valoare din vector;
 plasăm în X[1] cea mai mică valoare rămasă;
 etc.

O reprezentare a algoritmului este:


 parcurgem vectorul cu indicele i
 parcurgem cu indicele j elementele din dreapta lui X[i]
 dacă elementele X[i] și X[j] nu sunt în ordinea dorită, le interschimbăm

Exemplu:
Să ordonăm următorul vector, în care n=5:

Pentru aceasta vom avea câteva iterații:

i=0 i=1 i=2 i=3 Rezultat final

O secvență C++ ar fi următoarea:

int n, X[100];
//citire X[] cu n elemente
for(int i = 0 ; i < n - 1 ; i ++)
for(int j = i + 1 ; j < n ; j ++)
if(X[i] > X[j]){
int aux = X[i];
X[i] = X[j]; X[j] = aux;
}
Notă:
 Algoritmul descris mai sus se mai numește sortare prin selecție generală, sau implicită.
 O altă variantă este următoarea, în care pentru fiecare secvență i ... n-1 se determină explicit
minimul și se interschimbă cu X[i].

Astfel obținem următoarea secvență C++:

int n, X[100];
//citire X[] cu n elemente
for(int i = 0; i < n - 1; i++){
int p = i;
for(int j = i + 1; j < n; j++)
if(X[j] < X[p]) p= j;
int aux = X[i];
X[i] = X[p]; X[p] = aux;
}

Notă:
 Pentru a vizualiza fiecare pas al acestei metode accesați link-ul de mai jos:
http://www.cs.armstrong.edu/liang/animation/web/SelectionSort.html

METODA BUBBLESORT

Cunoscută și sub numele BubbleSort, metoda bulelor se bazează pe următoare idee:


 fie un vector X[] cu n elemente
 parcurgem vectorul și pentru oricare două elemente învecinate care nu sunt în ordinea dorită,
le interschimbăm valorile
 după o singură parcurgere, vectorul nu se va sorta, dar putem repeta parcurgerea
 dacă la o parcurgere nu se face nicio interschimbare, vectorul este sortat

O reprezentare a algoritmului este:


 cat timp vectorul nu este sortat
 presupunem că vectorul este sortat
 parcurgem vectorul
 dacă două elemente învecinate nu sunt în ordinea dorită
 le interschimbăm
 schimbăm presupunerea inițială

Exemplu:
Să ordonăm următorul vector, în care n=5:

Pentru aceasta vom avea câteva iterații:


 După prima parcurgere;
 După a doua parcurgere;
 După a treia parcurgere;
 Rezultatul final.
Notă:
 Aceste parcurgeri le vom identifica astfel: i=0, i=1, i=2 și rezultatfinal.

i=0 i=1 i=2 Rezultat final

Deoarece am făcut Și acum am făcut Deoarece nu am făcut


interschimbări, nu știm interschimbări, nu știm nicio interschimbare,
dacă vectorul este dacă vectorul este decidem că vectorul
ordonat. ordonat (chiar dacă el este ordonat.
este).

O secvență C++ ar fi următoarea:

int n, v[100];
//citire v[] cu n elemente
bool sortat;
do{
sortat = true;
for(int i = 0 ; i < n - 1 ; i ++)
if(v[i] > v[i+1]){
int aux = v[i];
v[i] = v[i+1]; v[i+1] = aux;
sortat = false;
}
}
while(!sortat);

Observație:
 La fiecare parcurgere cel puțin un element ajunge pe poziția sa finală:
 la prima parcurgere cel mai mare element al vectorului ajunge pe poziția sa finală;
 la a doua parcurgere următorul cel mai mare element ajunge pe poziția finală;
 Nu mai are rost să parcurgem aceste elemente, fixate. Astfel, putem parcurge vectorul numai
până la indicele unde s-a făcut ultima interschimbare la parcurgerea anterioară.
Dacă vom reveni la exemplul precedent și vom aplica cele observate, vom obține cele trei parcurgeri
fundamentale de sortare.

Parcurgerea 1 Parcurgerea 2 Parcurgerea 3

Astfel obținem următoarea secvență C++:

int n, v[100];
//citire v[] cu n elemente
bool sortat;
int m = n;
do{
sortat = true;
int p = m;
for(int i = 0 ; i < p - 1 ; i ++)
if(v[i] > v[i+1]){
int aux = v[i];
v[i] = v[i+1]; v[i+1] = aux;
sortat = false;
m = i + 1;
}
}
while(!sortat);

Notă:
 Pentru a vizualiza fiecare pas al acestei metode accesați link-ul de mai jos:
http://www.cs.armstrong.edu/liang/animation/web/BubbleSort.html

S-ar putea să vă placă și