Sunteți pe pagina 1din 4

ALGORITMICA. Seminar 9: Variante ale algoritmilor de sortare 1. (Shell sorting - sortare prin insertie cu pas variabil.

) Unul dintre dezavantajele sortrii prin a insertie este faptul c la ecare etap un element al irului se deplaseaz cu o singur pozitie. a a s a a O variant de reducere a numrului de operatii efectuate este de a compara elemente aate la o a a distant mai mare (h 1) i de a realiza deplasarea acestor elemente peste mai multe pozitii. De a s fapt tehnica se aplic mod repetat pentru valori din ce ce mai mici ale pasului h, asigurnd ha n n a sortarea irului. Un ir x[1..n] este considerat h-sortat dac orice subir x[i0 ], x[i0 + h], x[i0 + 2h]... s s a s este sortat (i0 {1, . . . , h}). Aceasta este ideea algoritmului propus de Donald Shell 1959 n cunoscut sub numele shell sort. Elementul cheie al algoritmului reprezint alegerea valorilor pasului h. Pentru alegeri adecvate l a ale secventei hk se poate obtine un algoritm de complexitate O(n3/2 ) loc de O(n2 ) cum este n n cazul algoritmului clasic de sortare prin insertie. Exemplu. Exemplicm ideea algoritmului cazul unui ir cu 15 elemente pentru urmtoarele a n s a valori ale pasului: h=13, h=4, h=1 (care corespund unui ir hk dat prin relatia hk = 3hk1 + 1, s h1 = 1): Etapa 1: pentru h=13 se aplic algoritmul sortrii prin insertie subirurilor x[1], x[14] i x[2], x[15], a a s s singurele subiruri cu elemente aate la distanta h care au mai mult de un element: s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 14 8 10 7 9 12 5 15 2 13 6 1 4 3 11 i se obtine s 1 3 2 8 3 10 4 7 5 9 6 12 7 5 8 15 9 2 10 13 11 6 12 1 13 4 14 14 15 11

Etapa 2: pentru h=4 se aplic algoritmul sortrii prin insertie succesiv subirurilor: x[1], x[5], x[9], x[13], a a s x[2], x[6], x[10], x[14], x[3], x[7], x[11], x[15], x[4], x[8], x[12]. Dup prima subetap (prelucrarea primua a lui subir) prin care se ordoneaz subirul constituit din elementele marcate: s a s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 3 8 10 7 9 12 5 15 2 13 6 1 4 14 11 se obtine: 1 2 3 2 8 10 4 7 5 3 6 12 7 5 8 15 9 4 10 13 11 6 12 1 13 9 14 14 15 11

La a doua subetap se aplic sortarea prin insertie asupra subirului constituit din elementele a a s marcate: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 8 10 7 3 12 5 15 4 13 6 1 9 14 11 obtinndu-se aceeai conguratie (subirul este a s s acum subirul constituit din elementele marcate: s 1 2 3 4 5 6 7 8 9 10 11 2 8 10 7 3 12 5 15 4 13 6 obtinndu-se a 1 2 3 4 5 6 7 8 9 10 11 2 8 5 7 3 12 6 15 4 13 10 deja ordonat cresctor) din care se prelucreaz a a 12 1 12 1 13 9 13 9 14 14 14 14 15 11 15 11

Se aplic acum sortarea prin insertie asupra subirului constituit din elementele marcate: a s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 8 5 7 3 12 6 15 4 13 10 1 9 14 11 1

obtinndu-se a 1 2 3 4 2 8 5 1

5 3

6 12

7 6

8 7

9 4

10 13

11 10

12 15

13 9

14 14

15 11

Se aplic acum sortarea prin insertie asupra a ntregului ir. Pentru acest exemplu aplicarea s direct a sortrii prin insertie conduce la executia a 68 de comparatii pe cnd aplicarea sortarii cu a a a pas variabil de insertie conduce la executia a 34 de comparatii. Prelucrarea specic unei etape (o valoare a pasului de insertie) poate descris prin: a a insertie pas(real x[1..n], integer h) integer i, j real aux for i h + 1, n do aux x[i] j ih while j 1 AND aux < x[j] do x[j + h] x[j] j jh endwhile x[j + h] aux endfor return x[1..n] Aceast prelucrare se efectueaz pentru diferite valori ale lui h. Un exemplu de ir de valori a a s pentru h (care s-a dovedit a conduce la o variant ecient a algoritmului) este cel bazat pe relatia a a de recurent: hk = 3hk1 + 1, h1 = 1. Structura general a algoritmului va consta a a n: shellsort(real x[1..n]) integer h h1 while h n do h3h+1 endwhile repeat h hDIV 3 x[1..n] insertie pas(x[1..n], h) until h = 1 return x[1..n] O alt variant de alegere a pasului h, pentru care s-a demonstrat c are complexitatea O(n n) a a a este hk = 2k 1. 2. (Shaker sort.) Sortarea prin interschimbarea elementelor vecine asigur, la ecare pas al ciclului a exterior, plasarea cte unui element (de exemplu maximul din subtabloul tratat la etapa respectiv) a a pe pozitia nal. O variant ceva mai ecient ar ca la ecare etap s se plaseze pe pozitiile a a a a a nale cte dou elemente (minimul respectiv maximul din subtabloul tratat la etapa respectiv). a a a Pe de alt parte prin retinerea indicelui ultimei interschimnri efectuate, att la parcurgerea de la a a a stnga la dreapta ct i de la dreapta la stnga se poate limita regiunea analizat cu mai mult de a a s a a o pozitie att la stnga ct i la dreapta (cnd tabloul contine portiuni deja sortate). a a a s a Structura algoritmului este:

shakersort(real x[1..n]) integer s, d, i, t s 1; d n repeat t0 for i s, d 1 do if x[i] > x[i + 1] then x[i] x[i + 1]; t i endif endfor if t = 0 then d t; t 0 for i d, s + 1, 1 do if x[i] < x[i 1] then x[i] x[i 1]; t i endif endfor st endif until t = 0 OR s = d return x[1..n] 3. Counting sort - sortare prin numrare. S considerm problema sortrii unui tablou x[1..n] a a a a avnd elemente din {1, 2, . . . , m}. Pentru acest caz particular poate utilizat un algoritm de a complexitate liniar bazat pe urmtoarele idei: a a se construiete tabelul f [1..m] al frecventelor de aparitie a valorilor elementelor tabloului s x[1..n]; se calculeaz frecventele cumulate asociate; a se folosete tabelul frecventelor cumulate pentru a construi tabloul ordonat y. s Algoritmul poate descris prin: countingsort(integer x[1..n],m) integer i, f [1..m], y[1..n] for i 1, m do f [i] 0 endfor for i 1, n do f [x[i]] f [x[i]] + 1 endfor for i 2, m do f [i] f [i 1] + f [i] endfor for i n, 1, 1 do y[f [x[i]]] x[i] f [x[i]] f [x[i]] 1 endfor for i 1, n do x[i] y[i] endfor return x[1..n] Dac m O(n) atunci algoritmul de sortare prin numrare are complexitate liniar. Dac a a a a a m este mult mai mare dect n (de exemplu m O(n2 ) atunci ordinul de complexitate al ns a algoritmului de sortare este determinat de m. Att timp ct ciclul de construire al tabloului y este a a descresctor, algoritmul este stabil. a 4. Radix sort - sortare pe baza cifrelor. Considerm un tablou x[1..n] avnd elemente numere a a k este semnicativ mai mare dect n atunci naturale constituite din cel mult k cifre. Dac m = 10 a a sortarea prin numrare nu este ecient. Dac a k este mult mai mic dect n atunci un algoritm a a a ns a de complexitate O(kn) ar putea acceptabil. Un astfel de algoritm este cel bazat pe urmtoarea a idee: se ordoneaz tabloul raport cu cifra cea mai putin semnicativ a ecarui numr (folosind a n a a 3

counting sort) dup care se sorteaz raport cu cifra de rang imediat superior .a.m.d. pn se a a n s a a ajunge la cifra cea mai semnicativ. Deci structura general a algoritmului este: a a radixsort(integer x[1..n], k) integer i for i 0, k 1 do x[1..n] counting2(x[1..n], 9, i) endfor return x[1..n] Algoritmul counting2 este o adaptare a algoritmului de sortare prin numrare raport cu a n cifrele de un anumit rang (i): counting2(integer x[1..n],m,c ) integer i, j, f [0..m], y[1..n] for i 0, m do f [i] 0 endfor for i 1, n do j (x[i]DIV putere(10, c))MOD 10 f [j] f [j] + 1 endfor for i 1, m do f [i] f [i 1] + f [i] endfor for i n, 1, 1 do j (x[i]DIV putere(10, c))MOD 10 y[f [j]] x[i] f [j] f [j] 1 endfor for i 1, n do x[i] y[i] endfor return x[1..n] Algoritmul counting2 se apeleaz pentru m = 9 deci este de ordinul O(n). Pe de alt parte a a pentru ca algoritmul de sortare pe baza cifrelor s functioneze corect este necesar ca subalgoritmul a de sortare prin numrare apelat s e stabil. a a Tem (termen: 15 decembrie - 19 decembrie) a 1. Propuneti un algoritm care sorteaz cresctor elementele de pe pozitiile impare ale unui tablou a a i descresctor cele de pe pozitii pare. s a 2. Adaptati algoritmul de sortare prin numrare pentru ordonarea descresctoare a unui tablou. a a 3. Se consider un set de valori din {1, . . . , m}. Preprocesati acest set folosind un algoritm a de complexitate O(max{m, n}) astfel at rspunsul la nc a ntrebarea cte elemente se a a a n intervalul [a, b], a, b {1, . . . , m} s poat obtinut timp constant. a a n 4. Propuneti un algoritm de complexitate liniar pentru ordonarea cresctoare a unui tablou a a 2 1}. Indicatie. Se vor interconstituit din n valori ntregi apartinnd multimii {0, 2, . . . , n a preta valorile ca ind reprezentate baza n. n 5. Se consider un tablou constituit din triplete de trei valori a ntregi corespunztoare unei date a calendaristice. Propuneti un algoritm de ordonare cresctoare dup valoarea datei. a a

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