Sunteți pe pagina 1din 21

Capitolul 4

Analiza algoritmilor de sortare


4.1 Problematica sortrii a

Se consider un set nit de obiecte, ecare avnd asociat o caracteristic, a a a a numit cheie, ce ia valori a ntr-o multime pe care este denit o relatie de ordine. a Sortarea este procesul prin care elementele setului sunt rearanjate astfel at nc cheile lor s se ae a ntr-o anumit ordine. a Exemplul 4.1 Considerm setul de valori a ntregi: (5,8,3,1,6). acest caz In cheia de sortare coincide cu valoarea elementului. Prin sortare cresctoare se a obtine setul (1,3,5,6,8) iar prin sortare descresctoare se obtine (8,6,5,3,1). a Exemplul 4.2 Considerm un tabel constnd din nume ale studentilor i note: a a s ((Popescu,9), (Ionescu,10), (Voinescu,8), (Adam,9)). acest caz cheia de In sortare poate numele sau nota. Prin ordonare cresctoare dup nume se a a obtine ((Adam,9), (Ionescu,10), (Popescu,9), (Voinescu,8)), iar prin ordonare descresctoare dup not se obtine ((Ionescu,10), (Popescu,9), (Adam,9), (Voia a a nescu,8)). Pentru a simplica prezentarea, continuare vom considera c setul pren a lucrat este constituit din valori scalare ce reprezint chiar cheile de sortare i a s c scopul urmrit este ordonarea cresctoare a acestora. Astfel, a ordona setul a a a a (x1 , x2 , . . . , xn ) este echivalent cu a gsi o permutare de ordin n, (p(1), p(2), . . . , p(n)) astfel at xp(1) xp(2) . . . xp(n) . nc De asemenea vom considera c elementele setului sunt stocate pe un suport a de informatie ce permite accesul aleator la date. acest caz este vorba despre In sortare intern. cazul care suportul de informatie permite doar accea In n sul secvential la date trebuie folosite metode specice ncadrate categoria n metodelor de sortare extern. a 87

Pe de alt parte, functie de spatiul de manevr necesar pentru efectuarea a n a sortrii exist: a a Sortare ce folosete o zon de manevr de dimensiunea setului de date. s a a Dac setul initial de date este reprezentat de tabloul x[1..n], cel sortat se a va obtine ntr-un alt tablou y[1..n]. Sortare aceeai zon de memorie (sortare pe loc - in situ). Elementele n s a tabloului x[1..n] si schimb pozitiile astfel at dup a nc a ncheierea procesului s e ordonate. Este posibil ca i acest caz s se foloseasc o zon a s n a a a de memorie a aceasta este de regul de dimensiunea unui element i ns a s nu de dimensiunea ntregului tablou. continuare vom analiza doar metode de sortare intern aceeai zon In a n s a de memorie. Metodele de sortare pot caracterizate prin: Stabilitate. O metod de sortare este considerat stabil dac ordinea relaa a a a tiv a elementelor ce au aceeai valoare a cheii nu se modic proa s a n cesul de sortare. De exemplu dac asupra tabelului cu note din Exema plul 4.2 se aplic o metod stabil de ordonare descresctoare dup not a a a a a a se obtine ((Ionescu,10), (Popescu,9), (Adam,9), (Voinescu,8)) pe cnd a dac se aplic una care nu este stabil se va putea obtine ((Ionescu,10), a a a (Adam,9), (Popescu,9), (Voinescu,8)). a a a a a Naturalete. O metod de sortare este considerat natural dac numrul de operatii scade odat cu distanta dintre tabloul initial i cel sortat. O a s msur a acestei distante poate numrul de inversiuni al permutrii a a a a corespunztoare tabloului initial. a Ecient. O metod este considerat ecient dac nu necesit un volum mare a a a a a a de resurse. Din punctul de vedere al spatiului de memorie o metod de a sortare pe loc este mai ecient dect una bazat pe o zon de manevr a a a a a de dimensiunea tabloului. Din punct de vedere al timpului de executie este important s e efectuate ct mai putine operatii. general, a a In n analiz se iau considerare doar operatiile efectuate asupra elementelor a n tabloului (comparatii i mutri). O metod este considerat optimal s a a a a dac ordinul su de complexitate este cel mai mic din clasa de metode a a din care face parte. Simplitate. O metod este considerat simpl dac este intuitiv i uor de a a a a as s eles. nt Primele dou proprieti sunt specice algoritmilor de sortare pe cnd ula at a timele sunt cu caracter general. continuare vom considera cteva metode In a elementare de sortare caracterizate prin faptul c sunt simple, nu sunt cele a mai eciente metode, dar reprezint punct de pornire pentru metode avansate. a Pentru ecare dintre aceste metode se va prezenta: principiul, vericarea corectitudinii i analiza complexitii. s at 88

4.2
4.2.1

Sortare prin insertie


Principiu

Ideea de baz a acestei metode este: a Incepnd cu al doilea element al tabloului x[1..n], ecare element a este inserat pe pozitia adecvat n subtabloul care l precede. a La ecare etap a sortrii, elementului x[i] i se caut pozitia adecvat a a a a n subtabloul destinatie x[1..i 1] (care este deja ordonat) comparnd pe x[i] cu a elementele din x[1..i 1] ncepnd cu x[i 1] i crend spatiu prin deplasarea a s a spre dreapta a elementelor mai mari dect x[i]. Astfel structura general este a a descris algoritmul insertie. a n insertie(real x[1..n]) for i 2, n do a insereaz x[i] subirul x[1..i 1] astfel at x[1..i] s e ordonat a n s nc end for Sortarea prin insertie este detaliat Algoritmul 4.1. a n Algoritmul 4.1 Sortare prin insertie insertie1(real x[1..n]) for i 2, n do j i1 aux x[i] while j 1 and aux < x[j] do x[j + 1] x[j] j j1 end while x[j + 1] aux end for return x[1..n] Exist i alte metode de implementare a metodei. Astfel, pentru a evita a s efectuarea comparatiei j 1 la ecare iteratie interioar se plaseaz pe pozitia a a 0 tabloul x valoarea lui x[i], aceast pozitie jucnd rolul unui fanion. Astfel n a a cel mai trziu cnd j = 0 se ajunge la x[j] = x[i]. Aceast variant este descris a a a a a Algoritmul 4.2. n

4.2.2

Vericarea corectitudinii

Preconditia problemei este P = {n 1}, iar postconditia este Q ={x[1..n] este ordonat cresctor}. Pentru ciclul exterior (dup i) demonstrm c proprietatea a a a a invariant este {x[1..i 1] este ordonat cresctor}. La a a nceputul ciclului i = 2, 89

deci x[1..1] poate considerat cresctor. La sfritul prelucrrii (i = n + 1) a a s a invariantul implic evident postconditia. Rmne s artm c proprietatea a a a a aa a rmne adevrat i dup efectuarea prelucrrilor din cadrul ciclului. Pentru a a a as a a aceasta este sucient s artm c pentru ciclul interior (dup j) asertiunea a aa a a {x[1..j] este cresctor i aux x[j + 1] = x[j + 2] . . . x[i]} este invariant. a s a La sfritul ciclului while aceast proprietate ar implica una dintre relatiile: a s a n n x[1] . . . x[j] aux x[j + 1] = x[j + 2] . . . x[i] cazul care conditia de ieire din ciclu este aux x[j]; s aux x[1] = x[2] . . . x[i] cazul care conditia de ieire din ciclu n n s este j = 0. Oricare dintre aceste dou relatii ar conduce prin atribuirea x[j + 1] aux la a x[1] . . . x[j] x[j+1] x[j+2] . . . x[i] iar prin trecerea la urmtoarea a valoare a contorului (i i + 1) la faptul c x[1..i 1] este cresctor. a a Rmne doar s justicm invariantul ciclului while. La intrarea ciclu au a a a a n loc relatiile: j = i 1, aux = x[i] deci aux = x[j + 1] = x[i] iar cum x[1..i 1] este cresctor rezult c proprietatea invariant propus pentru while este a a a a a satisfcut. Artm c ea nu este alterat de prelucrrile din cadrul ciclului: a a aa a a a dac aux < x[j], prin atribuirea x[j + 1] x[j] se obtine: aux < x[j] = a x[j + 1] . . . x[i] iar dup j j 1 va adevrat asertiunea: { x[1..j] a a a cresctor i aux < x[j + 1] = x[j + 2] . . . x[i]. Cum x[j + 1] = x[j + 2] prin a s atribuirea x[j + 1] x[j] nu se pierde informatie din tablou. Oprirea algoritmului este asigurat de utilizarea cte unui contor pentru a a ecare dintre cele dou cicluri. a Algoritmul 4.2 Sortarea prin insertie cu folosirea unui fanion insertie2(real x[1..n]) for i 2, n do x[0] x[i] j i1 while x[0] < x[j] do x[j + 1] x[j] j j1 end while x[j + 1] x[0] end for return x[1..n]

4.2.3

Analiza complexitii at

Vom lua considerare doar operatiile de comparare i mutare (atribuire) efecn s tuate asupra elementelor tabloului. Fie TC (i) i TM (i) numrul comparatiilor s a 90

respectiv al atribuirilor care implic elementele tabloului pentru ecare i = a 2, n. In functie de problema concret de rezolvat poate mai mare costul a comparatiilor (dac compararea presupune efectuarea mai multor prelucrri) a a sau costul atribuirilor (dac elementele tabloului sunt structurate). a Cazul cel mai favorabil corespunde irului ordonat cresctor iar cel mai s a defavorabil celui ordonat descresctor. a cazul cel mai favorabil TC (i) = 1, iar TM (i) = 2 (este vorba de operatiile In care implic variabila ajuttoare aux i care dealtfel acest caz nu au nici un a a s n n efect) deci T (n) i=2 (TC (i)+TM (i)) = 3(n1). cazul cel mai defavorabil In n a a TC (i) = i iar TM (i) = i 1 + 2 = i + 1, obtinndu-se c T (n) i=2 (2i + 1) = n2 + 2n 3. a a Prin urmare 3(n 1) T (n) n2 + 2n 3 adic algoritmul sortrii prin insertie se ncadreaz clasele (n) i O(n2 ). a n s

4.2.4

Proprieti ale sortrii prin insertie at a

O proprietate important este faptul c cazul irurilor aproape sortate (numr a a n s a mic de inversiuni) comportarea algoritmului este apropiat de comportarea din a cazul cel mai favorabil. Aceasta nseamn ca este satisfcut proprietatea de a a a naturalete. Att timp ct conditia de continuare a ciclului interior este aux < x[j] a a algoritmul de sortare prin insertie este stabil. Dac a se folosete aux x[j] a ns s atunci stabilitatea nu mai este asigurat. a O alt caracteristic a sortrii prin insertie este faptul c pentru ecare a a a a comparatie efectuat se realizeaz deplasarea unui element cu o singur pozitie. a a a Aceasta nseamn eliminarea a cel mult unei inversiuni, adic aranjarea ora a n dinea dorit (dar nu neaprat pe pozitiile nale) ale unei perechi de elemente. a a Cum cazul cel mai defavorabil, cel al unui ir ordonat descresctor, sunt n s a n(n 1)/2 inversiuni rezult c sunt necesare tot attea comparatii. Aceasta a a a nseamn ca orice algoritm de sortare bazat pe transformri locale (intera a schimbri a ntre elemente vecine) apartine lui O(n2 ). Pentru reducerea ordinului de complexitate ar trebui s se realizeze interschimbri a a ntre elemente care nu sunt neaprat vecine. Aceasta este ideea variantei de algoritm descrise cona n tinuare.

4.2.5

Sortare prin insertie cu pas variabil

Unul dintre dezavantajele sortrii prin insertie este faptul c la ecare etap un a a a element al irului se deplaseaz cu o singur pozitie. O variant de reducere a s a a a numrului de operatii efectuate este de a compara elemente aate la o distant a a mai mare (h 1) i de a realiza deplasarea acestor elemente peste mai multe s pozitii. De fapt tehnica se aplic mod repetat pentru valori din ce ce mai a n n mici ale pasului h, asigurnd h-sortarea irului. a s

91

Un ir x[1..n] este considerat h-sortat dac orice subir x[i0 ], x[i0 + h], x[i0 + s a s 2h]... este sortat (i0 {1, . . . , h}). Aceasta este ideea algoritmului propus de Donald Shell 1959, algoritm cunoscut sub numele Shell sort. n Elementul cheie al algoritmului reprezint alegerea valorilor pasului h. l a Pentru alegeri adecvate ale secventei hk se poate obtine un algoritm de com plexitate mai mic (de exemplu O(n3/2 ) loc de O(n2 ) cum este cazul a n n algoritmului clasic de sortare prin insertie). O astfel de secvent de pai este a s hk = 2k 1 pentru 1 k lgn . Exemplu. Exemplicm ideea algoritmului cazul unui ir cu 15 elemente a n s pentru urmtoarele valori ale pasului: h = 13, h = 4, h = 1 (care corespund a s unui ir hk dat prin relatia hk = 3hk1 + 1, h1 = 1). Pentru acest ir s-a s ilustrat experimental c este ecient, fr a a determinat teoretic ordinul a a a ns de complexitate. Procesul de sortare const urmtoarele etape: a n a Etapa 1: pentru h = 13 se aplic algoritmul sortrii prin insertie subirurilor a a s (x[1], x[14]) i (x[2], x[15]), singurele subiruri cu elemente aate la distanta h s s care au mai mult de un element: 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 a a subirurilor: (x[1], x[5], x[9], x[13]), (x[2], x[6], x[10], x[14]), (x[3], x[7], x[11],x[15]), s (x[4], x[8], x[12]). Dup prima subetap (prelucrarea primului subir) prin care a a s se ordoneaz subirul constituit din elementele marcate: 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 2 8 3 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 a a s din elementele marcate: 1 2 2 8 3 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

obtinndu-se aceeai conguratie (subirul este deja ordonat cresctor). Se a s s a prelucreaz acum cel de al treilea subir: a s 1 2 3 2 8 10 obtinndu-se a 4 7 5 3 6 12 7 5 8 15 9 4 10 13 11 6 12 1 13 9 14 14 15 11

92

1 2

2 8

3 5

4 7

5 3

6 12

7 6

8 15

9 4

10 13

11 10

12 1

13 9

14 14

15 11

Se aplic acum sortarea prin insertie asupra subirului constituit din elementele a s marcate: 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 obtinndu-se a 1 2 3 2 8 5 4 1 5 3 6 12 7 6 8 7 9 4 10 13 11 10 12 15 13 9 14 14 15 11

Etapa 3: Se aplic sortarea prin insertie asupra a ntregului ir. s Intruct irul a s la care s-a ajuns prin prelucrrile anterioare este aproape sortat numrul de a a operatii efectuate ultima etap (cnd se aplic sortarea clasic prin insertie) n a a a a este semnicativ mai mic dect dac s-ar aplica algoritmul de sortare prin a a insertie irului initial. Pentru acest exemplu aplicarea direct a sortrii prin s a a insertie conduce la executia a 68 de comparatii pe cnd aplicarea sortarii cu pas a variabil de insertie conduce la executia a 34 de comparatii. Att prelucrarea a specic unei etape (pentru o valoare a pasului de insertie) ct i a a s ntreaga sortare sunt descrise Algoritmul 4.3. n Algoritmul 4.3 Sortarea prin insertie cu pas variabil (Shell sort) inser 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 end while x[j + h] aux end for return x[1..n] shellsort(real x[1..n]) integer h h1 while h n do h3h+1 end while repeat h hDIV 3 x[1..n] inser pas(x[1..n], h) until h = 1 return x[1..n]

4.3
4.3.1

Sortare prin selectie


Principiu

Ideea de baz a acestei metode este: a

93

Pentru ecare pozitie i, ncepnd cu prima, se selecteaz din sub a a tabloul ce ncepe cu acea pozitie cel mai mic element i se am s plaseaz pe locul respectiv (prin interschimbare cu elementul curent a de pe pozitia i) Structura general este descris algoritmul selectie. a a n selectie(real x[1..n]) for i 1, n 1 do se determin valoarea minim din x[i..n] i se interschimb cu x[i] a a s a end for Ciclul for continu pn la n 1 deoarece subtabloul x[n..n] contine un a a a singur element care este plasat chiar pe pozitia potrivit, ca urmare a inter a schimbrilor efectuate anterior. O variant de descriere a metodei selectiei este a a Algoritmul 4.4. Algoritmul 4.4 Sortare prin selectie selectie(real x[1..n]) for i 1, n 1 do ki for j i + 1, n do if x[k] > x[j] then kj end if end for if k = i then x[k] x[i] end if end for return (x[1..n])

4.3.2

Vericarea corectitudinii

Artm c un invariant al ciclului exterior (dup i) este: {x[1..i1] este ordonat aa a a nceput i = 1 deci x[1..0] este un cresctor i x[i 1] x[j] pentru j = i, n}. La a s tablou vid. Ciclul for interior (dup j) determin pozitia minimului din x[i..n]. a a Aceasta este plasat prin interschimbare pe pozitia i. Se obtine astfel c x[1..i] a a a este ordonat cresctor i c x[i] x[j] pentru j = i + 1, n. Dup incrementarea a s a lui i (la sfritul ciclului dup i) se reobtine proprietatea invariant. La nal a s a a i = n, iar invariantul conduce la x[1..n 1] cresctor i x[n 1] x[n] adic a s a x[1..n] este sortat cresctor. a

94

4.3.3

Analiza complexitii at

Indiferent de aranjarea initial a elementelor, numrul de comparatii efectuate a a este:


n1 n n1

TC (n) =
i=1 j=i+1

1=
i=1

(n i) = n(n 1)

n(n 1) n(n 1) = 2 2

cazul cel mai favorabil (ir ordonat cresctor) numrul interschimbrilor In s a a a este TM (n) = 0. cazul cel mai defavorabil (ir ordonat descresctor) pentru In s a ecare i se efectueaz o interschimbare (trei atribuiri), deci costul corespunztor a a a n modicrii elementelor tabloului este TM (n) = 3 n1 1 = 3(n 1). Lund a i=1 considerare att comparatiile ct i atribuirile se obtine c algoritmul sortrii a a s a a prin selectie apartine clasei (n2 ).

4.3.4

Proprieti ale sortrii prin selectie at a

Algoritmul este partial natural (numrul de comparatii nu depinde de gradul a de sortare al irului). varianta prezentat (cnd minimul este interschimbat s In a a cu pozitia curent) algoritmul nu este stabil. Dac a locul unei singure a a ns n interschimbri s-ar realiza deplasarea elementelor subtabloului x[i..k 1] la a dreapta cu o pozitie (ca algoritmul insertiei), iar x[k] (salvat prealabil n n ntr-o variabil auxiliar) s-ar transfera in x[i] algoritmul ar deveni stabil. a a

4.4
4.4.1

Sortare prin interschimbarea elementelor vecine


Principiu

Ideea de baz a acestei metode de sortare este: a Se parcurge tabloul de sortat i se compar elementele vecine iar s a dac acestea nu se a n ordinea corect se interschimb. Parcurga a a a erea se reia pn cnd nu mai este necesar nici o interschimbare. a a a a Structura general este descris algoritmul interschimbri. a a n a interschimbri (real x[1..n]) a repeat se parcurge tabloul i dac dou elemente vecine nu sunt ordinea s a a n corect sunt interschimbate a until nu mai este necesar nici o interschimbare a S considerm secventa interschimbrii elementelor vecine cazul care a a a n n nu sunt ordinea corect: n a

95

for i 1, n 1 do if x[i] > x[i + 1] then x[i] x[i + 1] end if end for Folosind ca invariant al prelucrrii repetitive proprietatea {x[i] x[j], a a a j = 1, i} se poate arta c prelucrarea de mai sus conduce la satisfacerea a postconditiei: {x[n] x[i], i = 1, n}. Pentru i = 1 proprietatea invariant este adevrat a a ntruct x[1] x[1]. Presupunem c proprietatea este adevrat a a a a pentru i. Dac x[i] x[i + 1] atunci nu se efectueaz nici o prelucrare i a a s rmne adevrat i pentru i + 1. Dac schimb x[i] > x[i + 1] atunci se a a a a s a n efectueaz interschimbarea astfel c x[i] < x[i + 1], deci proprietatea devine a a adevrat i pentru i + 1. a as Pe baza acestei proprieti a secventei de interschimbri se deduce c este at a a sucient s aplicm aceast prelucrare succesiv pentru x[1..n], x[1..n 1], . . ., a a a x[1..2]. Rezult c o prim variant a sortrii prin interschimbarea elementelor a a a a a a n vecine este cea descris Algoritmul 4.5. Algoritmul 4.5 Sortare prin interschimbarea elementelor vecine interschimbri1(real x[1..n]) a for i n, 2, 1 do for j 1, i 1 do if x[j] > x[j + 1] then x[j] x[j + 1] end if end for end for return (x[1..n])

4.4.2

Vericarea corectitudinii

Intruct s-a demonstrat c efectul ciclului interior este c plaseaz valoarea a a a a maxim pe pozitia i rezult c pentru ciclul exterior poate considerat ca a a a a invariant proprietatea {x[i + 1..n] este cresctor iar x[i + 1] x[j] pentru a a j = 1, i}. La ieirea din ciclul exterior, valoarea contorului i este 1 astfel c se s a obtine c x[1..n] este ordonat cresctor. a a

96

4.4.3

Analiza complexitii at

Numrul de comparatii efectuate nu depinde de gradul de sortare al irului a s initial ind orice situatie: n
n i1 n n1

TC (n) =
i=2 j=1

1=
i=2

(i 1) =
i=1

i=

n(n 1) . 2

schimb, numrul de interschimbri depinde de proprietile irului astfel: In a a at s n cazul cel mai favorabil (ir sortat cresctor) se obtine TM (n) = 0, iar cazul s a n cel mai defavorabil (ir sortat descresctor) se obtine costul TM (n) = 3n(n s a 1)/2 (o interschimbare presupune efectuarea a 3 atribuiri). Astfel numrul de a prelucrri analizate satisface: n(n 1)/2 T (n) 2n(n 1) adic algoritmul a a prezentat mai sus apartine clasei (n2 ).

4.4.4

Variante ale sortrii prin interschimbarea elemena telor vecine

Algoritmul interschimbri1 poate a mbuntit prin reducerea numrului a at a de comparatii efectuate, sensul c nu este necesar n a ntotdeauna s se para a nceput curg tabloul pentru i = 2, n. De exemplu, dac tabloul este de la a ordonat ar sucient o singur parcurgere care s verice c nu este necesar a a a a a efectuarea nici unei interschimbri. Pornind de la aceast idee se ajunge la a a varianta descris Algoritmul 4.6. a n Algoritmul 4.6 Variant a algoritmului de sortare prin interschimbarea elea mentelor vecine interschimbri2(real x[1..n]) a repeat inter false for i 1, n 1 do if x[i] > x[i + 1] then x[i] x[i + 1] inter true end if end for until inter =false return x[1..n] Pentru acest algoritm numrul de comparatii efectuate cazul cel mai a n n favorabil este TC (n) = n 1 iar cazul cel mai defavorabil este TC (n) = n s a j=1 (n 1) = n(n 1). In ceea ce privete costul interschimbrilor acesta este acelai ca pentru prima variant a algoritmului i anume 0 TM (n) s a s

97

3n(n 1)/2. Prin urmare costul total al prelucrrilor analizate satisface: a n 1 T (n) 5n(n 1) 2

adic algoritmul este din (n) i O(n2 ). a s Intruct la sfritul irului se formeaz un subir cresctor rezult c nu a a s s a s a a a mai este necesar s se fac comparatii acea portiune. Aceast portiune este a a n a limitat inferior de cel mai mare indice pentru care s-a efectuat interschimbare. a Pornind de la aceast idee se ajunge la varianta descris Algoritmul 4.7. a a n Algoritmul 4.7 Variant a algoritmului de sortare prin interschimbarea elea mentelor vecine interschimbri3(real x[1..n]) a mn repeat t0 for i 1, m 1 do if x[i] > x[i + 1] then x[i] x[i + 1] ti end if end for mt until t 1 return x[1..n] Sortarea prin interschimbarea elementelor vecine asigur, la ecare pas al cia clului exterior, plasarea cte unui element (de exemplu maximul din subtabloul a tratat la etapa respectiv) pe pozitia nal. O variant ceva mai ecient ar a a a a ca la ecare etap s se plaseze pe pozitiile nale cte dou elemente (minimul a a a a respectiv maximul din subtabloul tratat la etapa respectiv). Pe de alt parte a a prin retinerea indicelui ultimei interschimbri efectuate, att la parcurgerea de a a la stnga la dreapta ct i de la dreapta la stnga se poate limita regiunea aa a s a nalizat cu mai mult de o pozitie att la stnga ct i la dreapta (cnd tabloul a a a a s a contine portiuni deja sortate). Aceast variant (cunoscut sub numele de a a a shaker sort) este descris Algoritmul 4.8. a n Atta timp ct conditia pentru interschimbare este specicat prin inegalia a a tate strict (x[i] > x[i + 1]) oricare dintre variantele algoritmului este stabil. a a

98

Algoritmul 4.8 Varianta shaker sort 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 end if end for 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 end if end for st end if until t = 0 or s = d return x[1..n]

4.5

Limite ale ecientei algoritmilor de sortare bazati pe compararea ntre elemente

Valorile comparative ale numrului de prelucrri (comparatii i mutri asupra a a s a elementelor tabloului) pentru algoritmii de sortare descrii sunt prezentate s n Tabelul 4.1. sectiunea referitoare la sortarea prin insertie s-a mentionat In faptul c algoritmii de sortare bazati pe transformri locale (de exemplu, intera a schimbri ale elementelor vecine) au o complexitate ptratic cazul cel mai a a a n defavorabil. cazul general al algoritmilor de sortare ce folosesc compararea In ntre elemente se poate arta c ordinul de complexitate este cel putin n lg n. Acest lua a cru poate justicat prin faptul c procesul de sortare poate ilustrat printr-un a arbore de decizie caracterizat prin faptul c ecare nod intern corespunde unei a comparatii ntre dou elemente iar frontiera contine noduri corespunztoare tua a turor permutrilor posibile ale multimii elementelor ce trebuie sortate. Figura a 4.1 ilustreaz arborele de decizie corespunztor sortrii prin insertie cazul a a a n unui tablou cu 3 elemente. Ordinul de complexitate al algoritmului este dat de adncimea arborelui (numrul de nivele). cazul unei multimi cu n elea a In mente, numrul permutrilor este n! iar a a ntruct arborele de decizie este binar a

99

Algoritm insertie1 selectie

interschimbri1 a

interschimbri2 a

Caz defavorabil TC (n) TM (n) 2 2 n + n 2 n + 3n 4 n1 2(n 1) 2 2 3(n 1) T (n) n2 + 2n 3, ((n), O(n2 )) n(n 1) n(n 1) 0 3(n 1) 2 2 n2 + 5n 6 n(n 1) T (n) , ((n2 )) 2 2 n(n 1) n(n 1) n(n 1) 0 3 2 2 2 n(n 1) 2 T (n) 2n(n 1), ((n )) 2 n(n 1) n1 0 n(n 1) 3 2 5n(n 1) ,((n), O(n2 )) n 1 T (n) 2

Caz favorabil TC (n) TM (n)

Tabelul 4.1: Costurile algoritmilor elementari de sortare (numr de comparatii a si de transferuri de elemente) i ordinele de complexitate corespunztoare s a

rezult c adncimea lui, k, trebuie s satisfac: 1 + 2 + . . . + 2k n! adic a a a a a a a a 2k+1 1 n! ceea ce implic faptul c k (lgn!) = (n lg n). Prin urmare, numrul de comparatii efectuate, cel mai defavorabil caz, de ctre un a n a algoritm de sortare bazat pe compararea elementelor este cel putin n lg n. Un exemplu de algoritm care atinge aceast limit inferioar este cel bazat pe utia a a lizarea unei structuri de date speciale numit heap. Pe lng acest algoritm a a a (descris sectiunea urmtoare) exist i alti algoritmi care au ordin de comn a as plexitate n lg n e cazul cel mai defavorabil (sortarea prin interclasare) sau n cazul mediu (sortarea rapid). Aceti algoritmi sunt prezentati capitolul n a s n dedicat tehnicii divizrii. a

4.6

Sortarea folosind structura de tip heap

Un heap, numit uneori ansamblu sau movil este un tablou de elemente a H[1..n] care are proprietatea c pentru ecare element H[i] cu 1 i n/2 a sunt adevrate inegalitile: H[i] H[2i] i H[i] H[2i + 1] ( cazul care a at s n n 2i + 1 n. O astfel de structur poate vizualizat sub forma unui arbore a a binar aproape complet (arbore care ecare nod are doi i, iar ecare nivel n cu exceptia ultimului este complet). Fii unui nod aat pe pozitia i tablou n se a pe pozitiile 2i (ul stng) respectiv 2i + 1 (ul drept). In baza aceleiai a a s proprieti printele nodului de pe pozitia i tablou se a pe pozitia i/2 . at a n a Cteva exemple de astfel de structur vizualizat arborescent sunt prezentate a a a

100

x2 : x1 < x3 : x1 < x3 : x2 < (x 3 ,x 2 ,x 1 ) > (x 2 ,x 3 ,x 1 ) > (x 2 ,x 1 ,x 3 ) < (x 3 ,x 1 ,x 2 ) < x3 : x1 > (x 1 ,x 3 ,x 2 ) > x3 : x2 > (x 1 ,x 2 ,x 3 )

Figura 4.1: Arbore de decizie corespunztor sortrii prin insertie cazul unui a a n tablou cu trei elemente distincte Figura 4.2. n Aceste structuri de date sunt utile att pentru sortarea ecient a unui a a tablou ct i pentru implementarea cozilor de prioriti. aceast sectiune a s at In a structura de tip heap este folosit doar pentru implementarea unei metode a de sortare. Una dintre cele mai importante prelucrri referitoare la un heap este aceea a de a asigura satisfacerea proprietii corespunztoare ecrui element (nod): at a a valoarea corespunztoare nodului s e mai mare dect valorile corespunztoare a a a a ilor. Metoda de transformare a unui heap astfel at nodul i s satisfac pronc a a prietatea specic ( ipoteza c subarborii avnd rdcinile cei doi i satisa n a a a a n fac ecare proprietatea de heap) este descris Algoritmul 4.9 care primete a n s ca date de intrare tabloul corespunztor heapului i indicele nodului de unde a s ncepe procesul de reparare. Trebuie precizat faptul c nu toate cele n elea mente ale tabloului sunt considerate active la un moment dat astfel ca dimensiunea heapului, specicat algoritm prin size(H) poate mai mic dect a n a a n. Intruct un subarbore are cel mult 2n/3 noduri (cazul cel mai defavoraa bil este alnit cnd ultimul nivel al arborelului este completat pe jumtate) nt a a numrul de comparatii efectuate, T (n), satisface T (n) T (n/3) + 2 ceea ce a conduce la faptul c T (n) O(lg n). a Procesul propriu-zis de sortare const dou etape principale: a n a

101

(8 7 5 4 1 3 2)

(7 4 5 2 1 3)

(5 4 3 2 1)

Figura 4.2: Exemple de heap-uri descrise arborescent Algoritmul 4.9 Restaurarea proprietii de heap pornind de la nodul i at reHeap(H[1..n],i) if 2i size(H) and H[2i] > H[i] then imax 2i else imax i end if if 2i + 1 size(H) and H[2i + 1] > H[imax] then imax 2i + 1 end if if imax = i then H[i] H[imax] H[1..n] reHeap(H,imax) end if return H[1..n]

Construirea, pornind de la tabloul initial, al unui heap. Procesul de construire se bazeaz pe utilizarea algoritmului reHeap pentru ecare a element din prima jumtate a tabloului a ncepnd cu elementul de pe a pozitia n/2 Eliminarea succesiv din heap a nodului rdcin i plasarea acestuia la a a a as sfritul tabloului corespunztor heap-ului. La ecare etap dimensiunea a s a a heapului scade cu un element iar subtabloul ordonat de la sfritul zonei a s corespunztoare tabloului initial crete cu un element. a s Cele dou etape sunt descrise Algoritmul 4.10. a n Intruct algoritmul heapSort apeleaz de n 1 ori algoritmul reHeap care a a are ordinul de complexitate O(lg n) iar cum algoritmul de construire are ordinul O(n lg n) rezult c heapSort are de asemenea ordinul O(n lg n). Merit a a a mentionat faptul c marginea superioar n lg n pentru algoritmul de construire a a

102

Algoritmul 4.10 Construirea unui heap i sortarea pe baza acestuia s construireHeap(H[1..n]) heapSort(H[1..n]) size(H) n H[1..n] construireHeap(H) for i n/2 , 1, 1 do for i n, 2, 1 do H[1..n] reHeap(H,i) H[i] H[1] end for size(H) size(H) 1 return H[1..n] H[1..n] reHeap(H,1) end for return H[1..n]

al unui heap este larg i c se poate demonstra c acesta are de fapt complexas a a itate liniar. a

4.7

Algoritmi de sortare care nu folosesc compararea ntre elemente

Dac se cunosc informatii suplimentare despre elementele irului de sortat (de a s exemplu c apartin unei multimi de forma {1, . . . , m}) atunci se poate evita a compararea direct a ntre elemente i felul acesta se pot obtine algoritmi de s n complexitate mai mic dect nlgn. a a

4.7.1

Sortarea folosind tabel de frecvente

S considerm problema sortrii unui tablou x[1..n] avnd elemente din {1, 2, a a a a . . . , m}. Pentru acest caz particular poate utilizat un algoritm de complexitate O(m + n) bazat pe urmtoarele idei: a se construiete tabelul f [1..m] al frecventelor de aparitie ale valorilor s elementelor tabloului x[1..n]; se calculeaz frecventele cumulate asociate; a se folosete tabelul frecventelor cumulate pentru a construi tabloul ordos nat y. Ideea fundamental a acestui algoritm este de a determina, pentru ecare a element al tabloului de sortat, cte dintre elemente sunt mai mici dect el. a a Din acest motiv metoda este cunoscut i sub numele de sortare prin numrare as a (counting sort). Acest lucru este fcut a calculnd frecvente cumulate i a ns a s fr a compara direct elementele a a ntre ele. O variant de implementare este a descris Algoritmul 4.11. Dac m (n) atunci algoritmul are complexitate a n a liniar. Dac a m este mult mai mare dect n (de exemplu m (n2 )) a a ns a

103

atunci ordinul de complexitate al algoritmului de sortare este determinat de m. ceea ce privete stabilitatea, att timp ct ciclul de construire al tabloului In s a a y este descresctor, algoritmul este stabil. Spre deosebire de ceilalti algoritmi a de sortare analizati pn acum, acesta utilizeaz spatiu de memorie aditional a a a de dimensiune cel putin n. Algoritmul 4.11 Sortare pe baza unui tablou de frecvente CountingSort(integer x[1..n],m) integer i, f [1..m], y[1..n] for i 1, m do f [i] 0 end for for i 1, n do f [x[i]] f [x[i]] + 1 end for for i 2, m do f [i] f [i 1] + f [i] end for for i n, 1, 1 do y[f [x[i]]] x[i] f [x[i]] f [x[i]] 1 end for for i 1, n do x[i] y[i] end for return x[1..n]

4.7.2

Sortarea pe baza cifrelor

cazul care elementele tabloului de sortat sunt numere naturale cu cel mult In n k cifre, iar k este mic raport cu n atunci sortarea poate realizat timp n a n liniar raport cu n. Ideea acestei metode este de a realiza succesiv sortarea n la nivelul cifrelor numrului pornind de la cifra cea mai putin semnicativ: a a se ordoneaz tabloul raport cu cifra cea mai putin semnicativ a ecarui a n a numr (folosind de exemplu sortarea pe baza tabelului de frecvente) dup care a a se sorteaz raport cu cifra de rang imediat superior .a.m.d. pn se ajunge a n s a a la cifra cea mai semnicativ. Algoritmul 4.12 descrie structura general prea a cum i adaptarea algoritmului CountingSort cazul sortrii pe baza cifrelor s n a (functia cs). Algoritmul cs se apeleaz pentru m = 9 deci este de ordinul O(n). Pe a de alt parte pentru ca algoritmul de sortare pe baza cifrelor s functioneze a a

104

Algoritmul 4.12 Sortarea pe baza cifrelor radixsort(integer x[1..n], k) cs(integer x[1..n],m,c ) integer i integer i, j, f [0..m], y[1..n] for i 0, k 1 do for i 0, m do x[1..n] cs(x[1..n], 9, i) f [i] 0 end for end for return x[1..n] for i 1, n do j (x[i]DIV putere(10, c))MOD 10 f [j] f [j] + 1 end for for i 1, m do f [i] f [i 1] + f [i] end for 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 end for for i 1, n do x[i] y[i] end for return x[1..n]

corect este necesar ca subalgoritmul de sortare prin numrare apelat s e a a stabil. Dac m = 10k este semnicativ mai mare dect n atunci algoritmul a a nu este ecient. Dac a k este mult mai mic dect n atunci un algoritm de a ns a complexitate O(kn) ar putea acceptabil.

4.8

Probleme

Problema 4.1 Se consider un tablou ale crui elemente contin dou tipuri a a a de informatii: nume i nota. S se ordoneze descresctor dup not, iar pentru s a a a a aceeai not cresctor dup nume. s a a a Indicatie. Se sorteaz tabloul cresctor dup nume, dup care se aplic un a a a a a algoritm stabil pentru sortarea descresctoare dup not. a a a Problema 4.2 Propuneti un algoritm care sorteaz cresctor elementele de a a pe pozitiile impare ale unui tablou i descresctor cele de pe pozitii pare. s a Indicatie. Se aplic ideea de la h-sortarea prin insertie pentru h = 2 a a ns n prima etap se sorteaz cresctor iar a doua se sorteaz descresctor. a a a n a a Problema 4.3 Se consider o matrice ptratic de dimensiune n i elemente a a a s 105

reale, aij . S se reorganizeze matricea prin interschimbri de linii i coloane a a s astfel at elementele diagonalei principale s e ordonate cresctor. nc a a Indicatie. Se aplic algoritmul de sortare prin selectie asupra irului (a11 , a22 , a s . . ., ann ) a interschimbarea elementului aii cu elementul ajj se realizeaz ns a prin interschimbarea intregii linii i cu linia j i a coloanei i cu coloana j. s Problema 4.4 Se consider algoritmul: a alg(x[1..n]) for i 1, n 1 do if i MOD 2 = 1 then for j 1, n 1, 2 do if x[j] > x[j + 1] then x[j] x[j + 1] end if end for else for j 2, n 1, 2 do if x[j] > x[j + 1] then x[j] x[j + 1] end if end for end if end for return x[1..n] S se stabileasc care este efectul algoritmului asupra tabloului x[1..n] i s se a a s a stabileasc ordinul de complexitate. a Indicatie. Algoritmul asigur ordonarea cresctoare a lui x[1..n] iar ordinul de a a complexitate este O(n2 ). Problema 4.5 S se adapteze algoritmul de sortare pe baza tabelului de a frecvente (Algoritmul 4.11) astfel at tabloul y s contine elementele lui x nc a ordine descresctoare. n a Indicatie. Atribuirea y[f [x[i]]] x[i] se nlocuiete cu y[n + 1 f [x[i]]] x[i], s iar pentru a asigura stabilitatea parcurgerea lui x[1..n] se va face ncepnd cu a primul element. Problema 4.6 Se consider un set de valori din {1, . . . , m}. Preprocesati acest a set folosind un algoritm de complexitate O(max{m, n}) astfel at rspunsul nc a la ntrebarea cte elemente se a intervalul [a, b] ?, a, b {1, . . . , m} s a a n a poat obtinut timp constant. a n Indicatie. tabelul frecventelor cumulate (care poate construit in O(m+n)) In elementul f [b] reprezint numrul de elemente din tablou mai mici sau egale a a dect b, iar f [a 1] reprezint numrul elementelor strict mai mici dect a. a a a a 106

Astfel numrul de elemente cuprinse [a, b] se poate obtine printr-o singur a n a operatie: f [b] f [a 1]. Problema 4.7 Propuneti un algoritm de complexitate liniar pentru ordona a rea cresctoare a unui tablou constituit din n valori a ntregi apartinnd multimii a {0, 1, . . . , n2 1}. Indicatie. Se vor interpreta valorile ca ind reprezentate baza n. Ast n fel ecreia dintre cele n valori corespunde o pereche de cifre, c0 ,c1 a i {0, . . . , n 1} obtinute ca rest respectiv ct al artirii la n. Se poate ast a mp fel aplica algoritmul sortrii pe baza cifrelor cazul care valoarea maxim a n n a a cifrelor este m = n 1 iar numrul de cifre este k = 2. Ordinul de a complexitate este acest caz O(k(m + n)) adic O(n). n a Problema 4.8 Se consider un tablou constituit din triplete de trei valori a ntregi corespunztoare unei date calendaristice (zi,luna,an). Propuneti un ala goritm ecient de ordonare cresctoare dup valoarea datei. a a Indicatie. Se aplic un algoritm stabil de complexitate liniar (de exemplu a a sortarea prin numrare) succesiv pentru zi, luna i an. a s

107

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