Sunteți pe pagina 1din 18

Sortari interne - caracteristici generale

in aceleasi locatii (nr. minim de locatii suplimentare)


operatia de baza - compararea cheilor

Sortari interne - algoritmii


S. prin insertie directa S. prin selectie directa (a min. sau max.) S. prin interschimbare directa (BubbleSort)

Sortari interne - algoritmii


S. prin insertie directa sortarea prin insertie cu micsorarea incrementului (ShellSort) S. prin selectie directa (a min. sau max.) sortarea prin selectie folosind structuri arborescente (ansamble=heap)(HeapSort) S. prin interschimbare directa (BubbleSort) sortarea prin interschimbare folosind partitii (QuickSort)

Sortarea prin insertie directa


pas iterativ (1): se ia componenta A[2] i se insereaz la locul ei n vectorul sortat de lungime 1, A[1], producnd un vector sortat de lungime 2. pas iterativ (i): (pas) vectorul este mprit n dou pri: A[1], , A[i] este sortat cresctor i se numete destinaie, iar A[i+1], , A[n] este nc nesortat i se va numi surs. Se ia prima component din surs, A[i+1], i se caut s se insereze la locul ei n destinaie. Cutarea locului lui A[i+1] n destinaie se face linear, parcurgnd destinaia de la dreapta la stnga i mutnd pe rnd cte o poziie la dreapta componentele care sunt mai mari dect valoarea de inserat, pn cnd gsim locul valorii x = A[i+1] i o inserm.

Sortarea prin insertie directa


procedure InsDir (A) {sortare prin insertie directa a vectorului A[1..n]} for i:= 2 to n do x:= A[i]; {se caut locul valorii x n destinaie} j:= i- 1; while (j > 0) and (x < A[j]) do A[j+1]:= A[j] j:= j- 1 endwhile {inserarea lui x la locul lui} A[j+1]:= x endfor endproc.

Sortarea prin insertie directa (cont.)


procedure InsDir1(A) {s. prin insertie directa a vectorului A[1..n] cu componenta marcaj A[0]} for i:= 2 to n do {se introduce valoarea n componenta marcaj} A[0]:= A[i]; {se caut locul valorii n destinaie} j:= i-1; while (A[0] < A[j]) do A[j+1]:= A[j] j:= j-1 endwhile A[j+1]:= A[0] endfor endproc.

Sortarea prin insertie directa - complexitate


La fiecare pas iterativ i (cu i=1,,n-1) al algoritmului, cnd se insereaz componenta A[i+1] la locul ei n destinaie - notm cu Ci numrul de comparaii efectuat (presupunem c lucrm pe variante cu component marcaj, deci avem cte o singur comparaie ce controleaz ciclul while care caut locul inserrii efectund i mutri). Ci poate atinge o valoare maxim, i+1, dac valoarea de inserat este cea mai mic i va veni pe prima component a sursei; poate atinge o valoare minim, i anume 1, dac valoarea de inserat este cea mai mare i poziia ei va fi ultima din noua surs, iar valoarea medie a lui Ci va fi i/2. - notm cu Mi numrul de mutri efectuat de algoritm la pasul iterativ i, avem relaia Mi=Ci+1 ntre mutri i comparaii

Sortarea prin insertie directa - complexitate


Cmin= 1 + 1 + + 1 = n-1 pas 1 pas 2 pas n-1 Mmin= 2 + 2 + + 2 = 2(n-1) pas 1 pas 2 pas n-1

n(n 1) C max 2 3 n 1 2 n(n 1) n 2 3n - 4 M max 3 4 (n 1) 1 (n - 1) 2 2


Cmediu 1 1 n(n 1) 1 n 2 n 2 (2 3 ... n) Cmax 2 2 4 2 4
n2 n 2 n 2 9n 10 Cmediu 2(n 1) 2(n 1) 4 4

M mediu

Sortarea prin selecie directa a minimului


pas iterativ (i): (pas) vectorul este mprit n dou pri: destinaia A[1..i-1] ce conine minime puse la locul lor de paii anteriori, i sursa A[i..n], pe care se efectueaz o pas, adic se caut secvenial minimul din subvectorul surs i apoi se interschimb cu componenta A[i].

dimensiunea destinaiei crete cu 1, iar a sursei scade corespunztor. Dup n-1 pai iterativi vectorul A va fi sortat cresctor.

Sortarea prin selecie directa a minimului


procedure SelDir(A) for i:= 1 to n-1 do {cutarea secvenial a minimului n A[i..n] } k:= i; min:= A[i]; {iniializarea minimului} for j:= i+1 to n do if A[j] <min then {se schimb minimul local} k:= j; min:= A[j] endif endfor {schimbarea minimului cu A[i] } A[k]:= A[i] A[i]:= min endfor endproc

Sortarea prin selecie directa - complexitate

n(n-1) C (n 1) (n 2) ... 1 2
numrul de comparaii este independent de ordinea iniial a componentelor

Mmin=3+3++3=3(n-1).
M max [(n 1) 3] [(n 2) 3] ... [1 3]

(n 1) (n 2) ... 1 3(n 1)

n(n 1) 3(n 1) 2

M mediu n(ln e)

Sortarea prin interschimbare directa


(pas) parcurgem vectorul de la dreapta la stnga comparnd dou elemente succesive A[i-1] i A[i]; dac A[i-1] A[i] le lsm pe loc, dac A[i-1] > A[i] le interschimbm. pas iterativ (i): vectorul este mprit n dou pri: destinaia A[1..i-1] cela mai mici i-1 valori puse la locul lor de paii anteriori sursa A[i..n], pe care se efectueaz o pas, de la dreapta spre stnga, rezultat impingerea minimului din sursa pe A[i]. dimensiunea destinaiei crete cu 1, iar a sursei scade corespunztor. Dup n-1 pai iterativi vectorul A va fi sortat cresctor.

Sortarea prin interschimbare directa


procedure InterschDir(A) for j:=2 to n do for i:=n downto j do if A[i-1] > A[i] then interschimb (A[i-1], A[i]) endif endfor endfor endproc.

Sortarea prin interschimbare directamodificari


- posibilitatea reducerii numrului de pai iterativi

dac la o pas nu se face nici o interschimbare, atunci sursa este sortat i, cum i destinaia este, nseamn c ntregul vector A este sortat i este inutil s mai relum pasele
- scurtarea lungimii paselor

s inem minte, nu numai faptul c s-au fcut efectiv interschimbri, dar i locul unde s-a efectuat ultima interschimbare. Din acest loc, pn la destinaie, avem de-a face cu o bucat sortat, deci e suficient s relum pasa urmtoare de la n i pn aici. Dac ultima interschimbare s-a fcut ntre A[k1] i A[k], atunci sursa pentru pasul urmtor va fi A[k+1..n]. Se schimb deci i lungimea surselor

Sortarea prin interschimbare directa-complexitate


C (n 1) (n 2) ... 1 n(n-1) 2

numrul de comparaii pe care-l face algoritmul la fiecare pas iterativ i este determinat de lungimea subvectorului surs A[i..n] pe care se face o pas i este independent de ordinea cheilor. La pasul i algoritmul face Ci = n-1 comparaii
Mmin=0.

M max (n 1) * 3 (n 2) * 3 ... 1 * 3

3n(n-1) 2

M mediu

(n 1) (n 2) 1 3n(n-1) *3 * 3 ... * 3 2 2 2 4

Sortare Shell - s. prin insertie cu micsorarea incrementului


n 1959 D.L. Shell a propus un algoritm de sortare bazat pe metoda prin inserie direct, algoritm cu o performan mbuntit deoarece face comparaii ntre chei mai distanate din vector. Algoritmul sorteaz mai nti prin inserie subvectori obinui din vectorul iniial prin extragerea componentelor aflate la o distan h una de cealalt, distan care se numete increment. Repetnd procedeul pentru incremeni din ce n ce mai mici i, n final, pentru incrementul 1, se obine vectorul sortat.

Sortare Shell - s. prin insertie cu micsorarea incrementului


se consider un ir descresctor de numere naturale, numite incremeni dintre care ultimul, ht, este 1:
h1 > h2 > > hi > hi+1 > > ht = 1.

(1) Se pornete cu incrementul h1. (2) La pasul iterativ m se consider incrementul hm . Se sorteaz prin inserie direct subvectorii obinui din vectorul inial lund elemente aflate la distana hm, adic subvectorii:
A[1], A[hm+1], A[2hm+1], A[2], A[hm+2], A[hm], A[2hm],

Apoi se reia pasul (2) pentru incrementul hm+1. Deoarece ultimul increment este ht=1, ultimul pas iterativ t se reduce la sortarea prin inserie direct, deci vectorul va fi sortat.

Sortare Shell - s. prin insertie cu micsorarea incrementului


D. E. Knuth recomand incremeni obinui cu urmtoarele formule recursive: i , , avem 1, 4, 13, 40, i , , avem 1, 3, 15, 31, Exist o estimare a complexitii acestui algoritm care-l plaseaz n clasa O(n1,3) ,din punct de vedere al numrului de comparaii. Din punct de vedere al spaiului, am vzut c el necesit h(1) locaii suplimentare pentru componentele marcaj, cu ajutorul crora eliminm testele de nedepire a dimensiunii, teste care ar dubla numrul de comparaii.

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