Sunteți pe pagina 1din 3

TEMA 5

Metode de sortare: InsertionSort și CountingSort

METODA INSERTIONSORT

Sortarea prin inserție (Insertion Sort) se bazează pe următoarea idee:


 fie un vector X[] cu n elemente;
 dacă secvența cu indici 0, 1, …, i-1 este ordonată, atunci putem insera elementul X[i] în
această secvență astfel încât să fie ordonată secvența cu indici 0, 1, …, i-1, i.
 luăm pe rând fiecare element X[i] și îl inserăm în secvența din stânga sa;
 la final întreg vectorul va fi ordonat.

O reprezentare a algoritmului este:


 parcurgem vectorul cu indicele i:
o inserăm pe X[i] în secvența din stânga sa;
o pentru inserare se mută unele elemente din secvență spre dreapta.

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

Sortarea prin inserție presupune următoarele transformări ale vectorului:

Transformările vectorului Rezultat final


În secvențele următoare considerăm că tabloul are elementele indexate de la 0 la n-1:

int n, X[100];
//citire X[] cu n elemente
for(int i = 1 ; i < n ; i ++)
{
int x = a[i];
int p = i - 1;
while(p >= 0 && a[p] > x)
a[p + 1] = a[p], p --;
a[p + 1] = x;
}

Sau:

for(int i = 1 ; i < n ; i ++)


{
int p = i;
while(p > 0 && a[p] < a[p-1])
{
int aux = a[p];
a[p] = a[p-1];
a[p-1] = aux;
p --;
}
}

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

METODA COUNTINGSORT

Sortarea prin numărare (Counting Sort) este o metodă de sortare a vectorilor ce se bazează pe
utilizarea unui vector de frecvență. Acest algoritm de sortare poate fi extrem de eficient în anumite
situații, în funcție de intervalul de valori al elementelor vectorului. Vom considera că vrem să sortăm
un vector v, de lungime n, indexat de la 1 și cu elementele cuprinse între 0 și MAX−1.

Algoritm
 Se parcurge vectorul v și se rețin frecvențele elementelor sale în vectorul de frecvență frq.
 Se parcurge vectorul frq de la 0 la MAX−1MAX−1, dacă vrem să realizăm o sortare
crescătoare, sau de la MAX−1 la 0 în caz contrar.
 Considerăm k noua lungime a vectorului, și o inițializăm cu 0.
 Pentru fiecare element frq[i], adăugăm valoarea i la finalul vectorului (pe poziția k, ce mai
întâi este incrementată) de frq[i] ori, pentru că de atâtea ori apare aceasta în v.
 Ordinea în care este parcurs vectorul de frecvență ne garantează că elementele vor fi
reintroduse în vector gata sortate.
Exemplu

Am notat vectorul inițial cu v, vectorul sortat cu w, iar vectorul de frecvență cu frq:

Implementare în C++

Mai jos este implementarea algoritmului în C++. Nimic special… L-am parcurs pe v de la 1 la n și am
actualizat frecvența (numărul de apariții) ale elementului curent (v[i]) prin frq[v[i]]++. Apoi, l-am
parcurs pe frq de la 0 la MAX−1 (pentru că ăsta e intervalul de valori al elementelor lui v). Pentru
fiecare element frq[i], cât timp e nenul, îl decrementez, incrementez noul capăt al lui v (k), și îl copiez
acolo pe i.

for (int i = 1; i <= n; i++)


frq[v[i]]++;

int k = 0;
for (int i = 0; i < MAX; i++)
while (frq[i]--)
v[++k] = i;

Observație:
 Sortarea prin numărare nu este un algoritm de sortare prin comparare, deoarece nu se
efectuează nicio comparație între elementele vectorului.
 Soluția poate fi adaptată și pentru cazul în care intervalul de valori al lui vv conține și numere
negative.
 Dacă nu avem nevoie de forma inițială a vectorului (cea nesortată), putem calcula frecvențele
încă din timpul citirii vectorului. De asemenea, dacă nu trebuie decât să afișăm vectorul sortat,
putem afișa elementele direct în while, fără să mai reconstruim vectorul.

Notă:
 Pentru a vizualiza fiecare pas al acestei metode accesați link-ul de mai jos:
https://www.cs.usfca.edu/~galles/visualization/CountingSort.html

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