Sunteți pe pagina 1din 1

Modulul IV.

Algoritmi de sortare
Orice colectie de obiecte intre care exista o relatie de ordine poate fi sortatat
adica aranjata in ordine crescatoare sau descrescatoare. De exemplu, putem aranja
cartile dintr-o biblioteca in ordine alfabetica dupa autor sau dupa titlu, sau chiar dupa
culoare, daca stabilim in prealabil o ierarhie a culorilor, putem aranja studentii unei
grupe in ordine alfabetica dupa numele de familie sau in ordine descrescatoare a
mediei fiecarui student.
In cele ce urmeaza presupunem ca avem o colectie de obiecte R1, R2, ..., RN ce
trebuie sortata intr-o anumita ordine, sa zicem crescator dupa una din caracteristicile
comune ale obiectelor din colectie pe care o vom numi cheie si o vom nota K. Deci
vrem sa gasim o permutare p a numerelor 1, 2, ..., N, astfel incat K p(1)  Kp(2)  ... 
Kp(N) sau o modalitate de rearanjare a obiectelor astfel incat K1  K2  ...  KN.

Capitolul 10. Sortare prin numarare

Aceasta tehnica de sortare se bazeaza pe faptul dupa sortare elementul aflat


pozitia i are cheia mai mare decat cheile a i -1 elemente si deci numarand pentru
fiecare element din lista, cate elemente au cheile mai mici decat cheia lui gasim
pozitia elementului in sirul ordonat. Pentru memorarea pozitiei se foloseste un sir
auxiliar.
Algoritm de sortare prin numarare: Se dau K1, K2, ..., KN. Se determina pozitia
fiecarui element in sirul ordonat. Se foloseste sirul auxiliar poz cu N elemente intregi.
Dupa terminarea algoritmului, poz[i] va reprezenta pozitia lui Ki in sirul ordonat.
for i = 1, N
poz[i] = 1
endfor
for i = 1, N-1
for j = i+1, N
if Kj < Ki then poz[i] = poz[i] + 1
else poz[j] = poz[j] + 1
endif
endfor
endfor
Observatie: ca algoritmul functioneaza chiar si daca elementele au chei egale.
Analiza algoritmului: Observati ca exista o singura clasa de valori posibile de
intrare. Asa cum mentionam in finalul capitolului 9 Analiza eficientei algoritmilor,
vom determina numai numarul de operatii de baza efectuate, in cazul nostru de
N 1
1
comparatii. Numar total comparatii =   N  i   N ( N  1) . Deci algoritmul este
i 1 2
2
O(N ) (deci nu este un algoritm rapid) si, in plus, necesita si un spatiu de memorie
pentru cele N elemente ale sirului auxiliar. De fapt, nu am prezentat acest algoritm
pentru eficienta sa ci pentru simplitatea sa.

Scrieti un program care implementeaza algoritmul de mai sus.


Lab 11
1