Capitolul 4

Analiza algoritmilor de sortare
4.1 Problematica sort˘rii a

Se consider˘ un set finit de obiecte, fiecare avˆnd asociat˘ o caracteristic˘, a a a a numit˘ cheie, ce ia valori ˆ a ıntr-o multime pe care este definit˘ o relatie de ordine. ¸ a ¸ Sortarea este procesul prin care elementele setului sunt rearanjate astfel ˆ at ıncˆ cheile lor s˘ se afle ˆ a ıntr-o anumit˘ ordine. a Exemplul 4.1 Consider˘m setul de valori ˆ a ıntregi: (5,8,3,1,6). ˆ acest caz In cheia de sortare coincide cu valoarea elementului. Prin sortare cresc˘toare se a obtine setul (1,3,5,6,8) iar prin sortare descresc˘toare se obtine (8,6,5,3,1). ¸ a ¸ Exemplul 4.2 Consider˘m un tabel constˆnd din nume ale studentilor ¸i note: a a ¸ s ((Popescu,9), (Ionescu,10), (Voinescu,8), (Adam,9)). ˆ acest caz cheia de In sortare poate fi numele sau nota. Prin ordonare cresc˘toare dup˘ nume se a a obtine ((Adam,9), (Ionescu,10), (Popescu,9), (Voinescu,8)), iar prin ordonare ¸ descresc˘toare dup˘ not˘ se obtine ((Ionescu,10), (Popescu,9), (Adam,9), (Voia a a ¸ nescu,8)). Pentru a simplifica prezentarea, ˆ continuare vom considera c˘ setul preın a lucrat este constituit din valori scalare ce reprezint˘ chiar cheile de sortare ¸i a s c˘ scopul urm˘rit este ordonarea cresc˘toare a acestora. Astfel, a ordona setul a a a a (x1 , x2 , . . . , xn ) este echivalent cu a g˘si 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 specifice ˆ ¸ ıncadrate ˆ categoria ın metodelor de sortare extern˘. a 87

Pe de alt˘ parte, ˆ functie de spatiul de manevr˘ necesar pentru efectuarea a ın ¸ ¸ a sort˘rii exist˘: a a • Sortare ce folose¸te 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 ˆ aceea¸i 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˘ fie 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˘ ˆ aceea¸i zon˘ In a ın s a de memorie. Metodele de sortare pot fi caracterizate prin: Stabilitate. O metod˘ de sortare este considerat˘ stabil˘ dac˘ ordinea relaa a a a tiv˘ a elementelor ce au aceea¸i valoare a cheii nu se modific˘ ˆ 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 descresc˘toare dup˘ not˘ a a a a a a se obtine ((Ionescu,10), (Popescu,9), (Adam,9), (Voinescu,8)) pe cˆnd ¸ 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˘ num˘rul de ¸ operatii scade odat˘ cu distanta dintre tabloul initial ¸i cel sortat. O ¸ a ¸ ¸ s m˘sur˘ a acestei distante poate fi num˘rul de inversiuni al permut˘rii a a ¸ a a corespunz˘toare tabloului initial. a ¸ Eficient˘. O metod˘ este considerat˘ eficient˘ 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 eficient˘ decˆt 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˘ fie efectuate cˆt mai putine operatii. ˆ general, ˆ a a ¸ ¸ In ın analiz˘ se iau ˆ considerare doar operatiile efectuate asupra elementelor a ın ¸ tabloului (comparatii ¸i mut˘ri). O metod˘ este considerat˘ optimal˘ ¸ s a a a a dac˘ ordinul s˘u 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 u¸or de a a a a as s ˆ ¸eles. ınt Primele dou˘ propriet˘¸i sunt specifice algoritmilor de sortare pe cˆnd ula at a timele sunt cu caracter general. ˆ continuare vom considera cˆteva metode In a elementare de sortare caracterizate prin faptul c˘ sunt simple, nu sunt cele a mai eficiente metode, dar reprezint˘ punct de pornire pentru metode avansate. a Pentru fiecare dintre aceste metode se va prezenta: principiul, verificarea corectitudinii ¸i analiza complexit˘¸ii. s at 88

1 Sortare prin insertie ¸ Principiu Ideea de baz˘ a acestei metode este: a ˆ Incepˆnd cu al doilea element al tabloului x[1...n] Exist˘ ¸i alte metode de implementare a metodei. fiecare element a este inserat pe pozitia adecvat˘ ˆn subtabloul care ˆl precede. Astfel. iar postconditia este Q ={x[1. Aceast˘ variant˘ este descris˘ a a a a a ˆ Algoritmul 4. Astfel ın a ¸ a cel mai tˆrziu cˆnd j = 0 se ajunge la x[j] = x[i]. ın 4.i − 1] astfel ˆ at x[1.i − 1] (care este deja ordonat) comparˆnd pe x[i] cu ¸ a elementele din x[1.. ¸ aı ı La fiecare etap˘ a sort˘rii.2 4..n] este ¸ ¸ ordonat cresc˘tor}. La ˆ a a ınceputul ciclului i = 2..4.2.2.... pentru a evita a s efectuarea comparatiei j ≥ 1 la fiecare iteratie interioar˘ se plaseaz˘ pe pozitia ¸ ¸ a a ¸ 0 ˆ tabloul x valoarea lui x[i]. n do j ←i−1 aux ← x[i] while j ≥ 1 and aux < x[j] do x[j + 1] ← x[j] j ←j−1 end while x[j + 1] ← aux end for return x[1.n]) ¸ for i ← 2.i − 1] este ordonat cresc˘tor}.. elementului x[i] i se caut˘ pozitia adecvat˘ ˆ a a a ¸ a ın subtabloul destinatie x[1. aceast˘ pozitie jucˆnd rolul unui fanion.n].2.n]) ¸ for i ← 2. ¸ a ın Algoritmul 4. 89 .i − 1] ˆ ıncepˆnd cu x[i − 1] ¸i creˆnd spatiu prin deplasarea a s a ¸ spre dreapta a elementelor mai mari decˆt x[i]. Astfel structura general˘ este a a descris˘ ˆ algoritmul insertie.2 Verificarea corectitudinii Preconditia problemei este P = {n ≥ 1}.i] s˘ fie ordonat a ın s ıncˆ end for Sortarea prin insertie este detaliat˘ ˆ Algoritmul 4.1 Sortare prin insertie ¸ insertie1(real x[1.. n do a insereaz˘ x[i] ˆ sub¸irul x[1. a ın ¸ insertie(real x[1.1. Pentru ciclul exterior (dup˘ i) demonstr˘m c˘ proprietatea a a a a invariant˘ este {x[1.

≤ x[i] iar prin trecerea la urm˘toarea a valoare a contorului (i ← i + 1) la faptul c˘ x[1. a s a La sfˆr¸itul ciclului while aceast˘ proprietate ar implica una dintre relatiile: a s a ¸ ın ın • x[1] ≤ . a a R˘mˆne doar s˘ justific˘m invariantul ciclului while. . ¸ Oprirea algoritmului este asigurat˘ de utilizarea cˆte unui contor pentru a a fiecare dintre cele dou˘ cicluri. .3 Analiza complexit˘¸ii at Vom lua ˆ considerare doar operatiile de comparare ¸i mutare (atribuire) efecın ¸ s tuate asupra elementelor tabloului.i − 1] este cresc˘tor.j] este cresc˘tor ¸i aux ≤ x[j + 1] = x[j + 2] ≤ ..2.. ≤ x[j] ≤ aux ≤ x[j + 1] = x[j + 2] ≤ . ≤ x[j] ≤ x[j+1] ≤ x[j+2] ≤ . aux = x[i] deci aux = x[j + 1] = x[i] iar cum x[1.. R˘mˆne s˘ ar˘t˘m c˘ proprietatea a ¸ a a a aa a r˘mˆne adev˘rat˘ ¸i dup˘ efectuarea prelucr˘rilor din cadrul ciclului. prin atribuirea x[j + 1] ← x[j] se obtine: aux < x[j] = a ¸ x[j + 1] ≤ . . Cum x[j + 1] = x[j + 2] prin a s atribuirea x[j + 1] ← x[j] nu se pierde informatie din tablou... ≤ x[i]. . .deci x[1. La intrarea ˆ ciclu au a a a a ın loc relatiile: j = i − 1.j] a a a ¸ cresc˘tor ¸i aux < x[j + 1] = x[j + 2] ≤ . ≤ x[i] iar dup˘ j ← j − 1 va fi adev˘rat˘ asertiunea: { x[1. Pentru a a a as a a aceasta este suficient s˘ ar˘t˘m c˘ pentru ciclul interior (dup˘ j) asertiunea a aa a a ¸ {x[1. . Fie TC (i) ¸i TM (i) num˘rul comparatiilor s a ¸ 90 . . n do x[0] ← x[i] j ←i−1 while x[0] < x[j] do x[j + 1] ← x[j] j ←j−1 end while x[j + 1] ← x[0] end for return x[1. . Oricare dintre aceste dou˘ relatii ar conduce prin atribuirea x[j + 1] ← aux la a ¸ x[1] ≤ . ¸ s • aux ≤ x[1] = x[2] ≤ . ≤ x[i] ˆ cazul ˆ care conditia de ie¸ire din ciclu este aux ≥ x[j]. ≤ x[i]} este invariant˘..n] 4. . .i − 1] ¸ este cresc˘tor rezult˘ c˘ proprietatea invariant˘ propus˘ pentru while este a a a a a satisf˘cut˘. . La sfˆr¸itul prelucr˘rii (i = n + 1) a a s a invariantul implic˘ evident postconditia. a Algoritmul 4. Ar˘t˘m c˘ ea nu este alterat˘ de prelucr˘rile din cadrul ciclului: a a aa a a a dac˘ aux < x[j].1] poate fi considerat cresc˘tor. ≤ x[i] ˆ cazul ˆ care conditia de ie¸ire din ciclu ın ın ¸ s este j = 0. . . . ..2 Sortarea prin insertie cu folosirea unui fanion ¸ insertie2(real x[1.n]) ¸ for i ← 2. .

Pentru reducerea ordinului ¸ de complexitate ar trebui s˘ se realizeze interschimb˘ri ˆ a a ıntre elemente care nu sunt neap˘rat vecine. In functie de problema concret˘ de rezolvat poate fi mai mare costul ¸ a comparatiilor (dac˘ compararea presupune efectuarea mai multor prelucr˘ri) ¸ a a sau costul atribuirilor (dac˘ elementele tabloului sunt structurate). De fapt tehnica se aplic˘ ˆ mod repetat pentru valori din ce ˆ ce mai ¸ a ın ın mici ale pasului h. Dac˘ ˆ a se folose¸te aux ≤ x[j] ¸ a ıns˘ s atunci stabilitatea nu mai este asigurat˘. a ın s 4. 4. ˆ cazul cel mai defavorabil In n ¸ a a TC (i) = i iar TM (i) = i − 1 + 2 = i + 1. O variant˘ de reducere a s a a ¸ a num˘rului de operatii efectuate este de a compara elemente aflate la o distant˘ a ¸ ¸a mai mare (h ≥ 1) ¸i de a realiza deplasarea acestor elemente peste mai multe s pozitii. cel al unui ¸ir ordonat descresc˘tor. obtinˆndu-se c˘ T (n) ≤ i=2 (2i + 1) = n2 + 2n − 3.2. a Cazul cel mai favorabil corespunde ¸irului ordonat cresc˘tor iar cel mai s a defavorabil celui ordonat descresc˘tor. a ˆ cazul cel mai favorabil TC (i) = 1.4 Propriet˘¸i ale sort˘rii prin insertie at a ¸ O proprietate important˘ este faptul c˘ ˆ cazul ¸irurilor aproape sortate (num˘r a a ın s a mic de inversiuni) comportarea algoritmului este apropiat˘ de comportarea din a cazul cel mai favorabil. a a ¸ Cum ˆ cazul cel mai defavorabil. sunt ın s a n(n − 1)/2 inversiuni rezult˘ c˘ sunt necesare tot atˆtea comparatii. n. ¸ a a a ¸ Aceasta ˆ ınseamn˘ eliminarea a cel mult unei inversiuni. asigurˆnd h-sortarea ¸irului. iar TM (i) = 2 (este vorba de operatiile In ¸ care implic˘ variabila ajut˘toare 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(n−1).5 Sortare prin insertie cu pas variabil ¸ Unul dintre dezavantajele sort˘rii prin insertie este faptul c˘ la fiecare etap˘ un a ¸ a a element al ¸irului se deplaseaz˘ cu o singur˘ pozitie. a s 91 . ¸ Atˆt timp cˆt conditia de continuare a ciclului interior este aux < x[j] a a ¸ algoritmul de sortare prin insertie este stabil. a a Prin urmare 3(n − 1) ≤ T (n) ≤ n2 + 2n − 3 adic˘ algoritmul sort˘rii prin insertie se ˆ ¸ ıncadreaz˘ ˆ clasele Ω(n) ¸i O(n2 ).respectiv al atribuirilor care implic˘ elementele tabloului pentru fiecare i = a 2. a O alt˘ caracteristic˘ a sort˘rii prin insertie este faptul c˘ pentru fiecare a a a ¸ a comparatie efectuat˘ se realizeaz˘ deplasarea unui element cu o singur˘ pozitie. Aceasta a a a ¸ ˆ ınseamn˘ ca orice algoritm de sortare bazat pe transform˘ri locale (intera a schimb˘ri ˆ a ıntre elemente vecine) apartine lui O(n2 ).2. adic˘ aranjarea ˆ ora a ın dinea dorit˘ (dar nu neap˘rat pe pozitiile finale) ale unei perechi de elemente. Aceasta este ideea variantei de algoritm descrise ˆ cona ın tinuare. Aceasta ˆ ınseamn˘ ca este satisf˘cut˘ proprietatea de a a a naturalete.

Pentru acest ¸ir s-a s ilustrat experimental c˘ este eficient. .. x[7]. Exemplu. h1 = 1). x[11]. s (x[4]. algoritm cunoscut sub numele ”Shell sort”. Exemplific˘m ideea algoritmului ˆ cazul unui ¸ir cu 15 elemente a ın s pentru urm˘toarele valori ale pasului: h = 13. x[10]. (x[3]. Procesul de sortare const˘ ˆ urm˘toarele etape: a ın a Etapa 1: pentru h = 13 se aplic˘ algoritmul sort˘rii prin insertie sub¸irurilor a a ¸ s (x[1]. x[9]. O astfel de secvent˘ de pa¸i este ¸ a s hk = 2k − 1 pentru 1 ≤ k ≤ lgn .n] este considerat h-sortat dac˘ orice sub¸ir x[i0 ]...x[15]). x[6]. x[14]). este sortat (i0 ∈ {1. ı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). . h = 1 (care corespund a ¸ s unui ¸ir hk dat prin relatia hk = 3hk−1 + 1. Aceasta este ideea algoritmului propus de Donald Shell ˆ 1959. Dup˘ prima subetap˘ (prelucrarea primului sub¸ir) prin care a a s se ordoneaz˘ sub¸irul 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 sub¸irului 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 obtinˆndu-se aceea¸i configuratie (sub¸irul este deja ordonat cresc˘tor). ın Elementul cheie al algoritmului ˆ reprezint˘ alegerea valorilor pasului h. x[14]) ¸i (x[2]. h = 4. f˘r˘ ˆ a a fi determinat teoretic ordinul a a a ıns˘ de complexitate. x[8]. h}). . Se ¸ a s ¸ s a prelucreaz˘ acum cel de al treilea sub¸ir: a s 1 2 3 2 8 10 obtinˆndu-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 . singurele sub¸iruri cu elemente aflate 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 sort˘rii prin insertie succesiv a a ¸ sub¸irurilor: (x[1]. x[13]). x[12]). . x[15]). x[5]. x[i0 + s a s 2h]. x[i0 + h]. (x[2].Un ¸ir x[1.

n] ← inser pas(x[1.n]) integer h h←1 while h ≤ n do h←3∗h+1 end while repeat h ← hDIV 3 x[1.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 sub¸irului 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 obtinˆndu-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....n]. Atˆt prelucrarea ¸ ¸ ¸ a specific˘ unei etape (pentru o valoare a pasului de insertie) cˆt ¸i ˆ a ¸ a s ıntreaga sortare sunt descrise ˆ Algoritmul 4. ın Algoritmul 4. j real aux for i ← h + 1. Pentru acest exemplu aplicarea direct˘ a sort˘rii prin ¸ s ¸ a a insertie conduce la executia a 68 de comparatii pe cˆnd aplicarea sortarii cu pas ¸ ¸ ¸ a variabil de insertie conduce la executia a 34 de comparatii.3 Sortarea prin insertie cu pas variabil (”Shell sort”) ¸ inser pas(real x[1.n] shellsort(real x[1. n do aux ← x[i] j ←i−h while j ≥ 1 and aux < x[j] do x[j + h] ← x[j] j ←j−h end while x[j + h] ← aux end for return x[1.3.n].. integer h) integer i... ˆ s Intrucˆt ¸irul a s la care s-a ajuns prin prelucr˘rile anterioare este aproape sortat num˘rul de a a operatii efectuate ˆ ultima etap˘ (cˆnd se aplic˘ sortarea clasic˘ prin insertie) ¸ ın a a a a ¸ este semnificativ mai mic decˆt dac˘ s-ar aplica algoritmul de sortare prin a a insertie ¸irului initial.1 Sortare prin selectie ¸ Principiu Ideea de baz˘ a acestei metode este: a 93 .3 4.n] 4.3. h) until h = 1 return x[1.

ca urmare a inter¸ a schimb˘rilor efectuate anterior..i−1] este ordonat aa a a ınceput i = 1 deci x[1..n]) 4.0] este un cresc˘tor ¸i x[i − 1] ≤ x[j] pentru j = i. a 94 .i] a ¸ ¸ a a este ordonat cresc˘tor ¸i c˘ x[i] ≤ x[j] pentru j = i + 1.3.. Algoritmul 4... iar invariantul conduce la x[1.2 Verificarea corectitudinii Ar˘t˘m c˘ un invariant al ciclului exterior (dup˘ i) este: {x[1. a a ın ¸ selectie(real x[1.. n − 1 do se determin˘ valoarea minim˘ din x[i. Ciclul for interior (dup˘ j) determin˘ pozitia minimului din x[i. Se obtine astfel c˘ x[1... ˆncepˆnd cu prima..4. n − 1 do k←i for j ← i + 1. n}.n] contine un a a a ¸ singur element care este plasat chiar pe pozitia potrivit˘.n]) ¸ for i ← 1.n].n] ¸i se interschimb˘ cu x[i] a a s a end for Ciclul for continu˘ pˆn˘ la n − 1 deoarece subtabloul x[n.n]) ¸ for i ← 1.. n do if x[k] > x[j] then k←j end if end for if k = i then x[k] ↔ x[i] end if end for return (x[1. Dup˘ incrementarea a s a lui i (la sfˆr¸itul ciclului dup˘ i) se reobtine proprietatea invariant˘. O variant˘ de descriere a metodei selectiei este a a ¸ Algoritmul 4.4 Sortare prin selectie ¸ selectie(real x[1.n − 1] cresc˘tor ¸i x[n − 1] ≤ x[n] adic˘ a s a x[1. n..n] este sortat cresc˘tor. La ˆ a s tablou vid. La final a s a ¸ a i = n. 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 ¸ Aceasta este plasat˘ prin interschimbare pe pozitia i.Pentru fiecare pozitie i.

3 Analiza complexit˘¸ii at Indiferent de aranjarea initial˘ a elementelor. ¸ ¸ 4.3. Luˆnd ˆ a i=1 considerare atˆt comparatiile cˆt ¸i atribuirile se obtine c˘ algoritmul sort˘rii a ¸ a s ¸ a a prin selectie apartine clasei Θ(n2 ). deci costul corespunz˘tor a a a ın modific˘rii elementelor tabloului este TM (n) = 3 n−1 1 = 3(n − 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˘ consider˘m secventa interschimb˘rii elementelor vecine ˆ cazul ˆ care a a ¸ a ın ın nu sunt ˆ ordinea corect˘: ın a 95 .. Parcurga aı a a erea se reia pˆn˘ cˆnd nu mai este necesar˘ nici o interschimbare. num˘rul de comparatii efectuate ¸ a a ¸ este: n−1 n n−1 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 cresc˘tor) num˘rul interschimb˘rilor In s a a a este TM (n) = 0.4 Propriet˘¸i ale sort˘rii prin selectie at a ¸ Algoritmul este partial natural (num˘rul de comparatii nu depinde de gradul ¸ a ¸ de sortare al ¸irului). a a a a Structura general˘ este descris˘ ˆ algoritmul interschimb˘ri. ˆ cazul cel mai defavorabil (¸ir ordonat descresc˘tor) pentru In s a fiecare i se efectueaz˘ o interschimbare (trei atribuiri).3.k − 1] la a dreapta cu o pozitie (ca ˆ algoritmul insertiei). a a ın a interschimb˘ri (real x[1.4.. Dac˘ ˆ a ˆ locul unei singure ¸ a a ıns˘ ın interschimb˘ri s-ar realiza deplasarea elementelor subtabloului x[i. iar x[k] (salvat ˆ prealabil ¸ ın ¸ ın ˆ ıntr-o variabil˘ auxiliar˘) s-ar transfera in x[i] algoritmul ar deveni stabil. a a 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 afl˘ ˆn ordinea corect˘ se interschimb˘.4 4. ˆ varianta prezentat˘ (cˆnd minimul este interschimbat s In a a cu pozitia curent˘) algoritmul nu este stabil.4.

¸ a a 96 . i − 1 do if x[j] > x[j + 1] then x[j] ↔ x[j + 1] end if end for end for return (x[1. Pentru i = 1 proprietatea invariant˘ este ¸ adev˘rat˘ ˆ a a ıntrucˆt x[1] ≥ x[1]. a as Pe baza acestei propriet˘¸i a secventei de interschimb˘ri se deduce c˘ este at ¸ a a suficient s˘ aplic˘m aceast˘ prelucrare succesiv pentru x[1. Algoritmul 4.. . Rezult˘ c˘ o prim˘ variant˘ a sort˘rii prin interschimbarea elementelor a a a a a a ın vecine este cea descris˘ ˆ Algoritmul 4. . 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]. −1 do for j ← 1..n]) 4. Dac˘ x[i] ≤ x[i + 1] atunci nu se efectueaz˘ nici o prelucrare ¸i a a s r˘mˆne adev˘rat˘ ¸i pentru i + 1. valoarea contorului i este 1 astfel c˘ se s a obtine c˘ x[1. i}. n}. i} se poate ar˘ta c˘ prelucrarea de mai sus conduce la satisfacerea a postconditiei: {x[n] ≥ x[i]. deci proprietatea devine a a adev˘rat˘ ¸i pentru i + 1. La ie¸irea din ciclul exterior.n] este ordonat cresc˘tor.5 Sortare prin interschimbarea elementelor vecine interschimb˘ri1(real x[1.n]. a a a x[1..for i ← 1.2].5.. n − 1 do if x[i] > x[i + 1] then x[i] ↔ x[i + 1] end if end for Folosind ca invariant al prelucr˘rii repetitive proprietatea {x[i] ≥ x[j]. 2..4.n]) a for i ← n. . x[1.2 Verificarea corectitudinii ˆ Intrucˆt 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 fi considerat˘ ca a ¸ a a a invariant˘ proprietatea {x[i + 1.n − 1].. i = 1. Presupunem c˘ proprietatea este adev˘rat˘ a a a a pentru i.n] este cresc˘tor iar x[i + 1] ≥ x[j] pentru a a j = 1.. a a a j = 1..

Astfel num˘rul de a prelucr˘ri analizate satisface: n(n − 1)/2 ≤ T (n) ≤ 2n(n − 1) adic˘ algoritmul a a prezentat mai sus apartine clasei Θ(n2 ). Pornind de la aceast˘ idee se ajunge la a a varianta descris˘ ˆ Algoritmul 4.4 Variante ale sort˘rii prin interschimbarea elemena telor vecine Algoritmul interschimb˘ri1 poate fi ˆ a ımbun˘t˘¸it prin reducerea num˘rului a at a de comparatii efectuate. 2 ˆ schimb. In ceea ce prive¸te costul interschimb˘rilor acesta este acela¸i ca pentru prima variant˘ a algoritmului ¸i anume 0 ≤ TM (n) ≤ s a s 97 .. num˘rul de interschimb˘ri depinde de propriet˘¸ile ¸irului astfel: ˆ In a a at s ın cazul cel mai favorabil (¸ir sortat cresc˘tor) se obtine TM (n) = 0. a ın Algoritmul 4.4. ¸ 4. 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.. iar ˆ cazul s a ¸ ın cel mai defavorabil (¸ir sortat descresc˘tor) se obtine costul TM (n) = 3n(n − s a ¸ 1)/2 (o interschimbare presupune efectuarea a 3 atribuiri).3 Analiza complexit˘¸ii at Num˘rul de comparatii efectuate nu depinde de gradul de sortare al ¸irului a ¸ s initial fiind ˆ orice situatie: ¸ ın ¸ n i−1 n n−1 TC (n) = i=2 j=1 1= i=2 (i − 1) = i=1 i= n(n − 1) .n]) a repeat inter ← false for i ← 1.4.n] Pentru acest algoritm num˘rul 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). ˆ sensul c˘ nu este necesar ˆ ¸ ın a ıntotdeauna s˘ se para a ınceput curg˘ tabloul pentru i = 2.6 Variant˘ a algoritmului de sortare prin interschimbarea elea mentelor vecine interschimb˘ri2(real x[1. De exemplu.4.6. dac˘ tabloul este de la ˆ a ordonat ar fi suficient˘ o singur˘ parcurgere care s˘ verifice c˘ nu este necesar˘ a a a a a efectuarea nici unei interschimb˘ri. n.

Aceast˘ portiune este a a ¸ ın ¸ a ¸ limitat˘ inferior de cel mai mare indice pentru care s-a efectuat interschimbare. la fiecare pas al cia clului exterior.8. a ın Atˆta timp cˆt conditia pentru interschimbare este specificat˘ prin inegalia a ¸ a tate strict˘ (x[i] > x[i + 1]) oricare dintre variantele algoritmului este stabil˘.3n(n − 1)/2. a a 98 .7 Variant˘ a algoritmului de sortare prin interschimbarea elea mentelor vecine interschimb˘ri3(real x[1. m − 1 do if x[i] > x[i + 1] then x[i] ↔ x[i + 1] t←i end if end for m←t until t ≤ 1 return x[1. Aceast˘ variant˘ (cunoscut˘ sub numele de ¸ ¸ a a a ”shaker sort”) este descris˘ ˆ Algoritmul 4. Pe de alt˘ parte a a prin retinerea indicelui ultimei interschimb˘ri efectuate.n] Sortarea prin interschimbarea elementelor vecine asigur˘. a a ın Algoritmul 4. a s ˆ Intrucˆt la sfˆr¸itul ¸irului se formeaz˘ un sub¸ir cresc˘tor rezult˘ c˘ nu a a s s a s a a a mai este necesar s˘ se fac˘ comparatii ˆ acea portiune. a Pornind de la aceast˘ idee se ajunge la varianta descris˘ ˆ Algoritmul 4. Prin urmare costul total al prelucr˘rilor analizate satisface: a n − 1 ≤ T (n) ≤ 5n(n − 1) 2 adic˘ algoritmul este din Ω(n) ¸i O(n2 ).7. atˆt la parcurgerea de ¸ a a la stˆnga la dreapta cˆt ¸i de la dreapta la stˆnga se poate limita regiunea aa a s a nalizat˘ cu mai mult de o pozitie atˆt la stˆnga cˆt ¸i la dreapta (cˆnd tabloul a ¸ a a a s a contine portiuni deja sortate). plasarea cˆte unui element (de exemplu maximul din subtabloul a tratat la etapa respectiv˘) pe pozitia final˘.. O variant˘ ceva mai eficient˘ ar fi a ¸ a a a ca la fiecare etap˘ s˘ se plaseze pe pozitiile finale cˆte dou˘ elemente (minimul a a ¸ a a respectiv maximul din subtabloul tratat la etapa respectiv˘).n]) a m←n repeat t←0 for i ← 1..

.1. t ← i end if end for s←t end if until t = 0 or s = d return x[1. t ← 0 for i ← d. Acest lua a ¸ cru poate fi justificat prin faptul c˘ procesul de sortare poate fi ilustrat printr-un a arbore de decizie caracterizat prin faptul c˘ fiecare nod intern corespunde unei a comparatii ˆ ¸ ıntre dou˘ elemente iar frontiera contine noduri corespunz˘toare tua ¸ a turor permut˘rilor posibile ale multimii elementelor ce trebuie sortate. d. ˆ sectiunea referitoare la sortarea prin insertie s-a mentionat In ¸ ¸ ¸ faptul c˘ algoritmii de sortare bazati pe transform˘ri locale (de exemplu. Figura a ¸ 4.1 ilustreaz˘ arborele de decizie corespunz˘tor sort˘rii prin insertie ˆ cazul a a a ¸ ın unui tablou cu 3 elemente.n]) integer s. i. ˆ cazul unei multimi cu n elea a In ¸ mente. t s ← 1. ˆ cazul general al algoritmilor de sortare ce folosesc compararea ˆ In ıntre elemente se poate ar˘ta c˘ ordinul de complexitate este cel putin n lg n. d − 1 do if x[i] > x[i + 1] then x[i] ↔ x[i + 1]. −1 do if x[i] < x[i − 1] then x[i] ↔ x[i − 1].5 Limite ale eficientei algoritmilor de sortare ¸ bazati pe compararea ˆ ¸ ıntre elemente Valorile comparative ale num˘rului de prelucr˘ri (comparatii ¸i mut˘ri asupra a a ¸ s a elementelor tabloului) pentru algoritmii de sortare descri¸i sunt prezentate ˆ s ın Tabelul 4. Ordinul de complexitate al algoritmului este dat de adˆncimea arborelui (num˘rul de nivele).n] 4.8 Varianta ”shaker sort” shakersort(real x[1.Algoritmul 4. d ← n repeat t←0 for i ← s.. intera ¸ a schimb˘ri ale elementelor vecine) au o complexitate p˘tratic˘ ˆ cazul cel mai a a a ın defavorabil. s + 1. num˘rul permut˘rilor este n! iar ˆ a a ıntrucˆt arborele de decizie este binar a 99 . t ← i end if end for if t = 0 then d ← t.

Ace¸ti algoritmi sunt prezentati ˆ capitolul ın a s ¸ ın dedicat tehnicii diviz˘rii. Un ¸ exemplu de algoritm care atinge aceast˘ limit˘ inferioar˘ este cel bazat pe utia a a lizarea unei structuri de date speciale numit˘ ”heap”.(Ω(n). + 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). iar fiecare nivel ın cu exceptia ultimului este complet).Algoritm insertie1 ¸ selectie ¸ interschimb˘ri1 a interschimb˘ri2 a Caz defavorabil TC (n) TM (n) 2 2 n + n − 2 n + 3n − 4 n−1 2(n − 1) 2 2 3(n − 1) ≤ T (n) ≤ n2 + 2n − 3. Fii unui nod aflat pe pozitia i ˆ tablou ¸ ¸ ın se afl˘ pe pozitiile 2i (fiul stˆng) respectiv 2i + 1 (fiul drept).1: Costurile algoritmilor elementari de sortare (num˘r de comparatii a ¸ si de transferuri de elemente) ¸i ordinele de complexitate corespunz˘toare s a rezult˘ c˘ adˆncimea lui. ˆ cel mai defavorabil caz. In baza aceleia¸i a ¸ a s propriet˘¸i p˘rintele nodului de pe pozitia i ˆ tablou se afl˘ pe pozitia i/2 . at a ¸ ın a ¸ Cˆteva exemple de astfel de structur˘ vizualizat˘ arborescent sunt prezentate a a a 100 . O(n2 )) n − 1 ≤ T (n) ≤ 2 Caz favorabil TC (n) TM (n) Tabelul 4.. trebuie s˘ satisfac˘: 1 + 2 + . . (Θ(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). Prin urmare.6 Sortarea folosind structura de tip ”heap” Un ”heap”. (Θ(n )) 2 n(n − 1) n−1 0 n(n − 1) 3 2 5n(n − 1) . (Ω(n). numit uneori ansamblu sau movil˘ este un tablou de elemente a H[1. . num˘rul de comparatii efectuate. de c˘tre un a ¸ ın a algoritm de sortare bazat pe compararea elementelor este cel putin n lg n. O astfel de structur˘ poate fi vizualizat˘ sub forma unui arbore a a binar aproape complet (arbore ˆ care fiecare nod are doi fii. a 4. O(n2 )) n(n − 1) n(n − 1) 0 3(n − 1) 2 2 n2 + 5n − 6 n(n − 1) ≤ T (n) ≤ . k. Pe lˆng˘ acest algoritm a a a (descris ˆ sectiunea urm˘toare) exist˘ ¸i alti algoritmi care au ordin de comın ¸ a as ¸ plexitate n lg n fie ˆ cazul cel mai defavorabil (sortarea prin interclasare) sau ın ˆ cazul mediu (sortarea rapid˘).n] care are proprietatea c˘ pentru fiecare element H[i] cu 1 ≤ i ≤ n/2 a sunt adev˘rate inegalit˘¸ile: H[i] ≥ H[2i] ¸i H[i] ≥ H[2i + 1] (ˆ cazul ˆ care a at s ın ın 2i + 1 ≤ n.

x 1 ) > (x 2 .x 2 ) < x3 : x1 > (x 1 . Intrucˆt un subarbore are cel mult 2n/3 noduri (cazul cel mai defavoraa bil este ˆ alnit cˆnd ultimul nivel al arborelului este completat pe jum˘tate) ıntˆ a a num˘rul de comparatii efectuate.x 3 ) < (x 3 .1: Arbore de decizie corespunz˘tor sort˘rii prin insertie ˆ cazul unui a a ¸ ın tablou cu trei elemente distincte ˆ Figura 4.x 3 .x2 : x1 < x3 : x1 < x3 : x2 < (x 3 .x 2 . Una dintre cele mai importante prelucr˘ri referitoare la un heap este aceea a de a asigura satisfacerea propriet˘¸ii corespunz˘toare fiec˘rui element (nod): at a a valoarea corespunz˘toare nodului s˘ fie mai mare decˆt valorile corespunz˘toare a a a a fiilor.2.x 1 ) > (x 2 .x 3 ) Figura 4. satisface T (n) ≤ T (n/3) + 2 ceea ce a ¸ conduce la faptul c˘ T (n) ∈ O(lg n). ˆ aceast˘ sectiune a s at In a ¸ structura de tip ”heap” este folosit˘ doar pentru implementarea unei metode a de sortare.x 3 . Metoda de transformare a unui heap astfel ˆ at nodul i s˘ satisfac˘ proıncˆ a a prietatea specific˘ (ˆ ipoteza c˘ subarborii avˆnd r˘d˘cinile ˆ cei doi fii satisa ın a a a a ın fac fiecare proprietatea de heap) este descris˘ ˆ Algoritmul 4. T (n).x 2 ) > x3 : x2 > (x 1 .x 2 .x 1 . Trebuie precizat faptul c˘ nu toate cele n elea mente ale tabloului sunt considerate active la un moment dat astfel ca dimensiunea heapului. ın Aceste structuri de date sunt utile atˆt pentru sortarea eficient˘ a unui a a tablou cˆt ¸i pentru implementarea cozilor de priorit˘¸i. a Procesul propriu-zis de sortare const˘ ˆ dou˘ etape principale: a ın a 101 . specificat˘ ˆ algoritm prin size(H) poate fi mai mic˘ decˆt a ın a a n.9 care prime¸te a ın s ca date de intrare tabloul corespunz˘tor heapului ¸i indicele nodului de unde a s ˆ ıncepe procesul de ”reparare”.x 1 .

a ¸ s Cele dou˘ etape sunt descrise ˆ Algoritmul 4. al unui heap.2: Exemple de heap-uri descrise arborescent Algoritmul 4.n] ←reHeap(H.n].10. La fiecare etap˘ dimensiunea a s a a heapului scade cu un element iar subtabloul ordonat de la sfˆr¸itul zonei a s corespunz˘toare tabloului initial cre¸te cu un element.n] • Construirea. a ın Intrucˆt 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). pornind de la tabloul initial. Procesul de ¸ construire se bazeaz˘ pe utilizarea algoritmului reHeap pentru fiecare a element din prima jum˘tate a tabloului ˆ a ıncepˆnd cu elementul de pe a pozitia n/2 ¸ • Eliminarea succesiv˘ din heap a nodului r˘d˘cin˘ ¸i plasarea acestuia la a a a as sfˆr¸itul tabloului corespunz˘tor heap-ului. Merit˘ a a a mentionat faptul c˘ marginea superioar˘ n lg n pentru algoritmul de construire ¸ a a 102 .imax) end if return H[1.9 Restaurarea propriet˘¸ii de heap pornind de la nodul i at reHeap(H[1...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..8 7 5 7 5 4 5 4 3 4 1 3 2 2 1 3 2 1 (8 7 5 4 1 3 2) (7 4 5 2 1 3) (5 4 3 2 1) Figura 4.

..n]. Dac˘ m ∈ Θ(n) atunci algoritmul are complexitate a ın a liniar˘. .n]) heapSort(H[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˘ decˆt nlgn. 2.. a a Din acest motiv metoda este cunoscut˘ ¸i sub numele de sortare prin num˘rare as a (”counting sort”).n] H[1. Dac˘ ˆ a m este mult mai mare decˆt n (de exemplu m ∈ Θ(n2 )) a a ıns˘ a 103 . . a ¸ • se folose¸te tabelul frecventelor cumulate pentru a construi tabloul ordos ¸ nat y. O variant˘ de implementare este a descris˘ ˆ Algoritmul 4.1) end for return H[1. Pentru acest caz particular poate fi utilizat un algoritm de complexitate O(m + n) bazat pe urm˘toarele idei: a • se construie¸te tabelul f [1. a a 4.Algoritmul 4..i) H[i] ↔ H[1] end for size(H) ← size(H) − 1 return H[1. • se calculeaz˘ frecventele cumulate asociate..n] avˆnd elemente din {1. .. .n] ←construireHeap(H) for i ← n/2 . −1 do H[1. 2.. a 4. cˆte dintre elemente sunt mai mici decˆt el..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.n] al unui heap este larg˘ ¸i c˘ se poate demonstra c˘ acesta are de fapt complexas a a itate liniar˘. a a a a .n] ← reHeap(H.n]) size(H) ← n H[1. pentru fiecare a element al tabloului de sortat.1 Sortarea folosind tabel de frecvente ¸ S˘ consider˘m problema sort˘rii unui tablou x[1.. Ideea fundamental˘ a acestui algoritm este de a determina. 1. −1 do for i ← n.n] ←reHeap(H.m] al frecventelor de aparitie ale valorilor s ¸ ¸ elementelor tabloului x[1. .11. . Acest lucru este f˘cut ˆ a calculˆnd frecvente cumulate ¸i a ıns˘ a ¸ s f˘r˘ a compara direct elementele ˆ a a ıntre ele..7.10 Construirea unui heap ¸i sortarea pe baza acestuia s construireHeap(H[1. m}..

m.2 Sortarea pe baza cifrelor ˆ cazul ˆ care elementele tabloului de sortat sunt numere naturale cu cel mult In ın k cifre..m].a. ¸ Algoritmul cs se apeleaz˘ pentru m = 9 deci este de ordinul O(n). algoritmul este stabil. −1 do y[f [x[i]]] ← x[i] f [x[i]] ← f [x[i]] − 1 end for for i ← 1. ˆ ceea ce prive¸te stabilitatea. y[1. m do f [i] ← f [i − 1] + f [i] end for for i ← n. Algoritmul 4.7.m) integer i. acesta utilizeaz˘ spatiu de memorie aditional ¸ a a a ¸ ¸ de dimensiune cel putin n. atˆt timp cˆt ciclul de construire al tabloului In s a a y este descresc˘tor. Pe a de alt˘ parte pentru ca algoritmul de sortare pe baza cifrelor s˘ functioneze a a ¸ 104 . pˆn˘ se ajunge a ın s a a la cifra cea mai semnificativ˘..d. iar k este mic ˆ raport cu n atunci sortarea poate fi realizat˘ ˆ timp ın a ın liniar ˆ raport cu n.n] 4.12 descrie structura general˘ prea a cum ¸i adaptarea algoritmului CountingSort ˆ cazul sort˘rii pe baza cifrelor s ın a (functia cs).atunci ordinul de complexitate al algoritmului de sortare este determinat de m. 1..n]. Ideea acestei metode este de a realiza succesiv sortarea ın la nivelul cifrelor num˘rului pornind de la cifra cea mai putin semnificativ˘: a ¸ a se ordoneaz˘ tabloul ˆ raport cu cifra cea mai putin semnificativ˘ a fiecarui a ın ¸ a num˘r (folosind de exemplu sortarea pe baza tabelului de frecvente) dup˘ care a ¸ a se sorteaz˘ ˆ raport cu cifra de rang imediat superior ¸. ¸ Algoritmul 4.11 Sortare pe baza unui tablou de frecvente ¸ CountingSort(integer x[1.n] for i ← 1. n do f [x[i]] ← f [x[i]] + 1 end for for i ← 2.. f [1. Spre deosebire de ceilalti algoritmi a ¸ de sortare analizati pˆn˘ acum. n do x[i] ← y[i] end for return x[1. m do f [i] ← 0 end for for i ← 1.

f [0...c ) integer i integer i. n do x[i] ← y[i] end for return x[1. y[1.n]. c))MOD 10 f [j] ← f [j] + 1 end for for i ← 1. ¸ s a ¸ Indicatie.n].. i) f [i] ← 0 end for end for return x[1. a a a Problema 4.n]. −1 do j ← (x[i]DIV putere(10. iar pentru ¸ s a a a a aceea¸i not˘ cresc˘tor dup˘ nume. a a a ın a a Problema 4.3 Se consider˘ o matrice p˘tratic˘ de dimensiune n ¸i elemente a a a s 105 . k) cs(integer x[1..12 Sortarea pe baza cifrelor radixsort(integer x[1.n] for i ← 1. k − 1 do for i ← 0. 4. Dac˘ m = 10k este semnificativ mai mare decˆt n atunci algoritmul a a nu este eficient.m. 9. Se aplic˘ ideea de la h-sortarea prin insertie pentru h = 2 ˆ a ˆ ¸ a ¸ ıns˘ ın prima etap˘ se sorteaz˘ cresc˘tor iar ˆ a doua se sorteaz˘ descresc˘tor...8 Probleme Problema 4.1 Se consider˘ un tablou ale c˘rui elemente contin dou˘ tipuri a a ¸ a de informatii: nume ¸i nota.Algoritmul 4.2 Propuneti un algoritm care sorteaz˘ cresc˘tor elementele de ¸ a a pe pozitiile impare ale unui tablou ¸i descresc˘tor cele de pe pozitii pare. c))MOD 10 y[f [j]] ← x[i] f [j] ← f [j] − 1 end for for i ← 1. j. Dac˘ ˆ a k este mult mai mic decˆt n atunci un algoritm de a ıns˘ a complexitate O(kn) ar putea fi acceptabil.m].. Se sorteaz˘ tabloul cresc˘tor dup˘ nume.. m do f [i] ← f [i − 1] + f [i] end for for i ← n. S˘ se ordoneze descresc˘tor dup˘ not˘. 1. s a a a Indicatie. n do j ← (x[i]DIV putere(10. m do x[1. dup˘ care se aplic˘ un ¸ a a a a a algoritm stabil pentru sortarea descresc˘toare dup˘ not˘.n] corect este necesar ca subalgoritmul de sortare prin num˘rare apelat s˘ fie a a stabil.n] ← cs(x[1.n] for i ← 0.

a22 .n] ¸i s˘ se a a s a stabileasc˘ ordinul de complexitate.reale. . m}. 2 do if x[j] > x[j + 1] then x[j] ↔ x[j + 1] end if end for else for j ← 2. m} s˘ a a ın a poat˘ fi obtinut ˆ timp constant. b ∈ {1.. . .. Se aplic˘ algoritmul de sortare prin selectie asupra ¸irului (a11 .n] se va face ˆ ıncepˆnd cu a primul element.5 S˘ se adapteze algoritmul de sortare pe baza tabelului de a frecvente (Algoritmul 4. n}) astfel ˆ at r˘spunsul ıncˆ a la ˆ ıntrebarea ”cˆte elemente se afl˘ ˆ intervalul [a. Algoritmul asigur˘ ordonarea cresc˘toare a lui x[1.n] S˘ se stabileasc˘ care este efectul algoritmului asupra tabloului x[1. n − 1 do if i MOD 2 = 1 then for j ← 1. n − 1. . S˘ se reorganizeze matricea prin interschimb˘ri de linii ¸i coloane a a s astfel ˆ at elementele diagonalei principale s˘ fie ordonate cresc˘tor. n − 1.n]) for i ← 1. Atribuirea y[f [x[i]]] ← x[i] se ˆ ¸ ınlocuie¸te cu y[n + 1 − f [x[i]]] ← x[i]. a. . s iar pentru a asigura stabilitatea parcurgerea lui x[1. a a a a 106 . ¸ a ¸ s . .4 Se consider˘ algoritmul: a alg(x[1. ˆ tabelul frecventelor cumulate (care poate fi construit in O(m+n)) ¸ In ¸ elementul f [b] reprezint˘ num˘rul de elemente din tablou mai mici sau egale a a decˆt b.. .6 Se consider˘ un set de valori din {1. a Indicatie.. ın a Indicatie. 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.11) astfel ˆ at tabloul y s˘ contine elementele lui x ¸ ıncˆ a ¸ ˆ ordine descresc˘toare. Preprocesati acest a ¸ set folosind un algoritm de complexitate O(max{m. aij .. b] ?”. . . 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.n] iar ordinul de ¸ a a complexitate este O(n2 ). . s Problema 4. iar f [a − 1] reprezint˘ num˘rul elementelor strict mai mici decˆt a. ıncˆ a a Indicatie. Problema 4. a ¸ ın Indicatie.. Problema 4.

luna ¸i an. . .an). Se poate ast¸ a ımp˘ ¸ fel aplica algoritmul sort˘rii pe baza cifrelor ˆ cazul ˆ care valoarea maxim˘ a ın ın a a ”cifrelor” este m = n − 1 iar num˘rul de ”cifre” este k = 2. a s 107 .luna. Se vor interpreta valorile ca fiind reprezentate ˆ baza n. Ordinul de a complexitate este ˆ acest caz O(k(m + n)) adic˘ O(n).Astfel num˘rul de elemente cuprinse ˆ [a. . a a Indicatie. c0 . . . Propuneti un ala ¸ goritm eficient de ordonare cresc˘toare dup˘ valoarea datei.c1 ∈ a ıi {0. ın a Problema 4.8 Se consider˘ un tablou constituit din triplete de trei valori a ˆ ıntregi corespunz˘toare unei date calendaristice (zi. b] se poate obtine printr-o singur˘ a ın ¸ a operatie: f [b] − f [a − 1]. . . Indicatie. 1. n2 − 1}. ¸ Problema 4. n − 1} obtinute ca rest respectiv cˆt al ˆ artirii la n. Ast¸ ın fel fiec˘reia dintre cele n valori ˆ corespunde o pereche de ”cifre”.7 Propuneti un algoritm de complexitate liniar˘ pentru ordona¸ a rea cresc˘toare a unui tablou constituit din n valori ˆ a ıntregi apartinˆnd multimii ¸ a ¸ {0. Se aplic˘ un algoritm stabil de complexitate liniar˘ (de exemplu ¸ a a sortarea prin num˘rare) succesiv pentru zi. .

Sign up to vote on this title
UsefulNot useful