Sunteți pe pagina 1din 5

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 pas 1 Mmin= 2 pas 1 + 1 + + 1 = n-1 pas 2 pas n-1 + 2 + + 2 = 2(n-1) pas 2 pas n-1

C max = 2 + 3 + + n =

M max = 3 + 4 + + (n + 1) =
C mediu

n(n + 1) n 2 + 3n - 4 1 + (n - 1) = 2 2 1 1 n(n + 1) 1 n 2 + n 2 = (2 + 3 + ... + n) = C max = = 2 2 4 2 4


n2 + n 2 n 2 + 9n 10 2(n 1) = 4 4

n(n + 1) 1 2

M mediu = Cmediu + 2(n 1) =

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


C = (n 1) + (n 2) + ... + 1 =

n(n-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) =

M mediu = n(ln + e)

n(n 1) + 3(n 1) 2

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 directa-modificari


- 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[k-1] 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


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 C = (n 1) + (n 2) + ... + 1 =

Mmin=0.
M mediu

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

3n(n-1) 2 (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.

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