Sunteți pe pagina 1din 27

Universitatea de Vest Timis, oara

s, i
Facultatea de Matematica

Informatica
Aplicata

Informatica

Algoritmi de sortare
Dana Madalina Enachiuc
danuk 51@yahoo.it

Contents
1 Abstract

2 Motivatie

3 Introducere
3.1 Clasificarea algoritmilor de sortare . . . . . . . . . . . . . . .
3.2 Metodele de sortare . . . . . . . . . . . . . . . . . . . . . . . .

3
4
5

4 Analiza algoritmilor de sortare


4.1 Sortare prin insert, ie . . . . . . . . . . . . . . . . .
4.1.1 Descriere s, i implementare . . . . . . . . .
4.1.2 Analiza complexitat, ii sortarii prin inserare
4.1.3 Proprietat, i ale sortarii prin insert, ie . . . .
4.2 Sortare prin select, ie . . . . . . . . . . . . . . . . .
4.2.1 Descriere s, i implementare . . . . . . . . .
4.2.2 Analiza complexitat, ii sortarii prin select, ie
4.2.3 Proprietat, i ale sortarii prin select, ie . . . .
4.3 Sortarea rapida Quicksort . . . . . . . . . . . . .
4.3.1 Descriere s, i implementare . . . . . . . . .
4.3.2 Analiza complexitat, ii - Quicksort . . . . .
4.3.3 Proprietat, i ale sortarii rapide . . . . . . .
4.4 Sortarea prin interclasare(merging) . . . . . . . .
4.4.1 Descriere s, i implementare . . . . . . . . .
4.4.2 Analiza complexitat, ii Mergesort . . . . .
4.4.3 Proprietat, i ale Mergesort . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

6
6
6
7
9
10
10
12
12
12
12
15
17
17
17
21
21

5 Compararea teoretic
a a algoritmilor

22

6 Compararea experimental
a a algoritmilor

22

7 Declarat, ie de originalitate

24

Abstract

Articolul analizeaza sortarea prin insert, ie, sortarea prin select, ie, sortarea
rapida s, i sortarea prin interclasare. Cei patru algoritmi sunt descris, i teoretic, prezentat, i n pseudocod s, i implementat, i n limbajul de programare C.
Sunt prezentate proprietat, iile s, i analizate complexitat, iile fiecarui algoritm.
Articolul se ocupa cu studiul comparat, iei teoretice s, i experimentale a algoritmilor.Folosind rezultatele obt, inute prin comparat, ia experimentala am
subliniat diferent, ele dintre algoritmi.

Motivatie

Suntem la nceputul unei noi revolut, ii digitale: daca n momentul de fat, a


exista aproximativ 9 miliarde de dispozitive conectate la internet, pana n
anul 2020 ne as, teptam ca acest numar sa ajunga la peste 50 de miliarde.
Sortarea este una dintre cele mai raspandite operatii care se executa pe
calculatoarele de astazi iar de eficienta ei depind performantele altor algoritmi.
Important, a algoritmilor n viat, a noastra nu poate fi exagerata. Ei sunt
folosit, i practic peste tot, de la institut, ii financiare la site-urile de ntalniri.
Primul motiv pentru care am ales aceasta tema este faptul ca algoritmi ne
modeleaza s, i ne controleaza lumea , cateva exemple sunt:
Nu cu mult timp n urma, motoarele de cautare se luptau pentru
supremat, ia pe Internet. Dar au aparut Google s, i algoritmul sau sau
inventiv PageRank.
Astazi, Google ocupa 66,7% din piat, a americana a motoarelor de cautare,
urmat de Microsoft (18,1%), Yahoo (11,2%), Ask (2,6%) s, i AOL (1,4%).
Acum Google domina piat, a de as, a maniera, ncat pentru mult, i dintre
noi nu se mai pune problema care este modul principal de acces pe
Internet.
Oricat de mult n-am vrea sa recunoas, tem, fluxurile de s, tiri de pe Faccebook sunt locul unde multora dintre noi le place sa-s, i piarda vremea.
In afara cazului n care preferint, ele sunt setate sa va arate toate activitat, ile, s, i actualizarile tuturor prietenilor dumneavoastra n ordine
cronologica, vet, i vedea o anumita select, ie de articole pe care algoritmul Facebook le-a ales doar pentru dumneavoastra.Pentru a calcula
care cont, inut este mai interesant sunt luat, i n considerare cat, iva factori cum ar fi: numarul de comentarii, cine a publicat s, tirea (da, este
o ordonare interna a celor mai populari oameni s, i a acelora cu care
interact, ionat, i cel mai mult) s, i ce fel de informatie este publicata: fotografie, video, statut, actualizare etc.)
Un alt motiv pentru care am ales aceasta tema, este sursa bibliografica,
lucrarile diverse pe care le-am avut la dispozitie pentru acest subiect, s, i mai
mult decat atat cartea Introducere n proiectarea s, i analiza algoritmilor ,care
este lucrarea de referint, a a acestui articol.

Introducere

Un algoritm de sortare aranjeaza elementele unei liste ntr-o anumita ordine.


Aces, ti algoritmi sunt folosit, i pentru a sorta liste fie de tip numeric, fie alfabetic. Inca de la nceputurile informaticii, algoritmii de sortare au atras
un numar mare de studii n domeniu. Des, i ideea de baza a lor este aparent
simpla s, i oarecum familiara, complexitatea rezolvarii eficiente a sortarii este
mare.[1]
Existent, a unor algoritmi de sortare eficient, i este esent, iala pentru utilizarea optima a altor algoritmi, cum ar fi cei de cautare, sau cei de interclasare. Pentru a considera un algoritm ca fiind de sortare, datele acestuia
de ies, ire trebuie sa ndeplineasca doua condit, ii:
ordinea elementelor din datele de ies, ire trebuie sa fie ori crescatoare,
ori descrescatoare;
datele de ies, ire trebuie sa fie o rearanjare, nu o alterare a acestora.
Des, i problema algoritmilor de sortare este considerata rezolvata de catre
mult, i specialis, ti din domeniu, variat, ii pe marginea acestor algoritmi continua
sa apara, mai ales cu aparit, ia noilor arhitecturi paralele, s, i cu accesul n masa
la ele.
Pe langa variat, iile pe marginea algoritmilor existent, i, au aparut s, i algoritmi de sortare noi, cum ar fi:
Library sort, descris de catre M. A. Bender, M. Farach-Colton s, i M.
Mosteiro n 2006 n lucrarea Insertion sort is Opnlognq - este un
Insertion sort cu elemente pauza, numit s, i Gapped Insertion sort.
Bead sort, descris de catre J. J. Arulanandham, Cristian S. Calude s, i
M. J. Dinneen n anul 2002 n lucrarea Bead-Sort: A Natural Sorting
Algorithm - este un algoritm de sortare complet original s, i face parte
din categoria celor care nu folosesc comparat, ii.
Spread sort, formulat de catre Steven J. Ross n 2002 n lucrarea The
Spreadsort High - performance General - case Sorting Algorithm mprumuta elemente de la Bucket sort, Radix sort s, i Quick sort.
Tim sort, formulat de catre Tim Peters n 2002 - este un algoritm
de sortare hibrid care a cunoscut un mare succes odata ce a devenit
metoda standard de sortare atat n limbajul Python cat s, i n Java.

3.1

Clasificarea algoritmilor de sortare

Putem clasifica algoritmii de sortare dupa o serie de criterii.


Cei mai cunoscut, i algoritmi sunt cei prin comparat, ie, iar cel mai comun
criteriu de clasificare a acestora este dupa metoda generala de lucru. Astfel
avem algoritmi de sortare prin:
Insert, ie:

Insertion sort un algoritm de sortare eficient pe liste de intrare


mici sau aproape sortate
Shell-sort
Binary tree sort
Cycle-sort un algoritm cu numarul de scrieri n memorie redus

Select, ie:

Selection-sort eficient pe liste de intrare mici


Heap-sort un algoritm de sortare cu timp de execut, ie constant
Smooth-sort inspirat de Heapsort, dezvoltat de catre Edsger
Dijkstra

Algoritmii de sortare prin insert, ie s, i select, ie sunt n general algoritmi care


nu pot fi us, or paralelizat, i, dar pot fi folosit, i mpreuna cu alt, i algoritmi pentru
a forma algoritmi de sortare hibrizi. Mai avem algoritmi de sortare prin:
Partit, ionare:

Quick-sort unul dintre cei mai cunoscut, i algoritmi de sortare


Intro-sort un hibrid ntre Quicksort s, i Heapsort

Interclasare (merging):

Merge-sort
Timsort este un hibrid ntre Mergesort s, i Insertion sort

Distribuire:

Bucket-sort

Algoritmii prin partit, ionare, interclasare s, i distribuire sunt algoritmii care


pot fi paralelizat, i cel mai us, or datorita naturii acestora.
Printre cei mai lent, i algoritmi se numara cei prin inter-schimbare:
4

Bubble-sort
Odd-even sort - o variat, ie us, or mbunatat, ita a Bubble-sort
Tot, i algoritmii prezentat, i anterior fac parte din categoria algoritmilor de
sortare prin comparat, ie. Exemple de algoritmi de sortare care nu folosesc
comparat, ia sunt:
Radix sort
Bead sort
Radix sort spre exemplu dateaza din 1887, fiind folosit de catre Herman Hollerith pe mas, ini tabelare. Modul de lucru al acestuia nu presupune
comparat, ia numerelor din lista de intrare, ci comparat, ia cifrelor numerelor,
n funct, ie de pozit, ia pe care o ocupa acestea.
Pe de alta parte, n funct, ie de spat, iul necesar pentru efectuarea sortarii
exista:
Sortare ce foloses, te o zona de dimensiunea setului de date. Daca setul
init, ial de date este reprezentat de tabloul xr1..ns, cel sortat se va obt, ine
ntr-un alt tablou y r1..ns.
Sortare n aceeas, i zona de memorie (sortare pe loc). Elementele tabloului
xr1..ns s, i schimba pozit, iile astfel ncat dupa ncheierea procesului sa
fie ordonate.Este posibil ca s, i n acest caz sa se foloseasca o zona de
memorie nsa aceasta este de regula de dimensiunea unui element s, i nu
de dimensiunea ntregului tablou.

3.2

Metodele de sortare

In continuare vom analiza doar metode de sortare interna n aceeas, i zona de


memorie.
Metodele de sortare pot fi caracterizate prin:
Stabilitate- O metoda de sortare este considerata stabila daca ordinea
relativa a elementelor ce au aceeas, i valoare a cheii,nu se modifica n procesul
de sortare.
Naturalet, e - O metoda de sortare este considerata naturala daca numarul
de operat, ii scade odata cu distant, a dintre tabloul init, ial s, i cel sortat.O
masura a acestei distant, e poate fi numarul de inversiuni al permutarii corespunzatoare tabloului init, ial.
Eficient,
a - O metoda este considerata eficienta daca nu necesita un
volum mare de resurse.Din punctul de vedere al spat, iului de memorie o
5

metoda de sortare pe loc este mai eficienta decat una bazata pe o zona
de dimensiunea tabloului.
Din punct de vedere al timpului de execut, ie este important sa fie efectuate cat mai put, ine operat, ii.In general, n analiza se iau n considerare doar
operat, iile efectuate asupra elementelor tabloului (comparat, ii s, i mutari).
O metoda este considerata optimala daca ordinul sau de complexitate
este cel mai mic din clasa de metode din care face parte.
Simplitate - O metoda este considerata simpla daca este intuitiva s, i us, or
de nt, eles. Primele doua proprietat, i sunt specifice algoritmilor de sortare pe
cand ultimele sunt cu caracter general.[2]

Analiza algoritmilor de sortare

In continuare vom considera cateva metode elementare de sortare caracterizate prin faptul ca sunt simple, nu sunt cele mai eficiente metode, dar
reprezinta punct de pornire pentru metode avansate. Pentru fiecare dintre
aceste metode se va prezenta: descriere s, i implementare, analiza complexitat, ii
s, i proprietat, i.

4.1
4.1.1

Sortare prin insert, ie


Descriere s, i implementare
PREZENTAREA METODEI

Se considera indicele j(1 j nq ce corespunde elementului care urmeaza


sa fie inserat. Elementele v1 , v2 , ..., vj 1 sunt elementele care sunt deja
aranjate astfel ncat v1 v2 ... vj 1 .
Indicele i se deplaseaza de la dreapta la stanga n interiorul vectorului.
Plecand de la pozitia j  1, elementele sunt succesiv, deplasate o pozitie spre
dreapta pana cand este gasita pozitia corecta pentru vj , moment n care
acesta este inserat.
Elementele de intrare sunt sortate pe loc, n cadrul aceluiasi vector v.
Deoarece vj va fi asezat la locul sau, aceasta metoda de sortare a fost
denumita metoda de cernere (sifting) sau scufundare (sinking).[3]
PREZENTAREA ALGORITMULUI
Algoritmul de sortarea prin inserare directa va sorta elementele sirului v1 , v2 , . . . , vn
iar dupa sortare, elementele vectorului vor fi n ordinea v1 v2 ... vn .
Pseudocodul pentru sortarea prin insertie directa este reprezentat prin
subprogramul numit inserare care are doi parametri:
6

n prin care primeste un numar natural ce reprezinta lungimea vectorului;


v prin care primeste un vector care memoreaza un sir de n numere care
trebuie sortat.
Algoritmul n pseudocod este urm
atorul:
Subalgoritm inserarepn, v q
for j 2, n do
aux v rj s
ij1
while pi  1q and pv ris auxq do
v ri 1s v ris
ii1
end while
v ri 1s aux
end for
Algoritmul n C este urm
atorul:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

insertSort (v , n)
{
i n t i , j , aux ;
f o r ( j = 1 ; j < n ; j = j + 1)
{
i = j  1;
aux = v [ i ] ;
w h i l e ( ( i >= 0 ) && ( aux < v [ i ] ) )
{
v [ i +1] = v [ i ] ;
i = i  1;
}
i f ( i != ( j  1) )
v [ i +1] = aux ;
}
}

4.1.2

Analiza complexit
at, ii sort
arii prin inserare

Vom relua prezentarea subprogramului sortarea prin insertie, adaugand costul de timp pentru fiecare instructiune si a numarului care reprezinta de cate
7

ori acesta este efectiv executata. Pentru fiecare j  2, 3, . . . , n unde n este


lungimea vectorului, vom nota tj numarul de executii ale testului cat timp
din linia 4 pentru valoarea fixata j.
Timpul de executie al algoritmului este suma tuturor timpilor de executie
corespunzatoare fiecarei instructiuni executate. O instructiune care consuma
timpul ci pentru executie si este executata de n ori, va contribui cu ci  n la
timpul total de executie.
Un fenomen de acest tip nu are loc atunci cand se refera la alte resurse,
cum ar fi de exemplu, memoria. O instructiune care se refera la m cuvinte
de memorie si este executata de n ori, nu consuma n general m  n cuvinte
de memorie.
Pentru a calcula T pnq, timpul de executie pentru sortarea prin insertie
directa, vom aduna produsele marimilor indicate n coloanele de cost si timp,
obtinand:
T pnq  c1 n c2 pn1q c3 pn1q c4

tj c5

j 2

ptj 1q

c6

j 2

ptj 1q

c7 pn1q

j 2

Pentru sortarea prin insertie directa, cazul cel mai favorabil apare cand
vectorul de intrare este deja sortat. Pentru fiecare j  2, 3, . . . , n vom gasi
v ris element n linia 4, cand i are valoarea initiala j  1. Rezulta ca tj  1
pentru j  2, 3, . . . , n si timpul de executie n cazul cel mai favorabil este:
T pnq  c1 n
T pnq  pc1

c2 pn  1q
c2

c3

c3 pn  1q

c4 pn  1q

c7 qn  pc2

c4

c3

c7 pn  1q
c4

c7q

Timp de executie poate fi exprimat sub forma an b pentru anumite


constante a si b care depind doar de timpii de executie ci fiind astfel o functie
liniara de n.
Cazul cel mai defavorabil apare daca vectorul este sortat n ordine inversa
n ordine descrescatoare. In aceasta situatie trebuie sa comparam fiecare
element v rj s cu fiecare element din subvectorul v r1s, v r2s, . . . , v rj  1s, astfel
tj  j pentru j  2, 3, . . . , n.
Observam ca:
n
npn 1q
j
1
2
j 2

s, i

pj  1q  npn2 1q

j 2

In cazul cel mai defavorabil timpii de executie pentru sortarea prin insertie
directa este:
T pnq  c1 n

c2 pn  1q

c3 pn  1q
c6 p

T pnq  p

c4
2

c5
2

c6 2
qn
2

npn

p c1

c4 p

1q
2

c2

npn

 1q
c4
2

c3

1q
2

 1q

c5 p

npn

1q
2

 1q

c7 pn  1q
c5
2

c6
2

c7 qn pc2

c3

c4

c7 q

Timpul de executie n cazul cel mai defavorabil poate fi exprimat sub


forma a2n bn c unde a, b si c depind de costurile ci ale instructiunilor, fiind
astfel o functie patratica de ordin n.
Sa presupunem ca alegem la ntamplare n numere si aplicam sortarea prin
insertie. Cat timp va fi necesar pentru a determina locul n care putem insera
v[j] n subvectorul v r1s, v r2s, . . . , v rj  1s?
In medie, jumatate din elementele subvectorului v r1s, v r2s, . . . , v rj  1s
sunt mai mici decat v rj s, si cealalta jumatate sunt mai mari. Prin urmare, n medie, trebuie verificate jumatate din elementele subvectorului
v r1s, v r2s, . . . , v rj  1s, deci tj  j {2. Daca tinem seama de aceasta observatie,
timpul de executie mediu va aparea tot ca o functie patratica de n, la fel ca
n cazul cel mai defavorabil.
Vom considera doar termenul dominant al formulei (adica a2n ) deoarece
ceilalti termeni sunt relativ nesemnificativi pentru valori mari ale lui n. Ignoram, de asemenea si factorul constant a, deoarece pentru numere foarte
mari, factorii constanti sunt mai putin semnificativi decat ordinul de crestere
n determinarea eficientei computationale a unor algoritmi.
Sortarea prin insertie are un timp de executie n cazul cel mai defavorabil
si n cazul mediu de pn2 q, adica algoritmul sortarii prin insert, ie se ncadreaza
n clasele pnq s, i Opn2 q.
4.1.3

Propriet
at, i ale sort
arii prin insert, ie

O proprietate importanta este faptul ca n cazul s, irurilor aproape sortate(numar


mic de inversiuni) comportarea algoritmului este apropiata de comportarea
din cazul cel mai favorabil. Aceasta nseamna ca este satisfacuta proprietatea
de naturalet, e.
Atat timp cat condit, ia de continuare a ciclului interior este aux v rj s
algoritmul de sortare prin insert, ie este stabil. Daca nsa se foloses, te aux
v rj s atunci stabilitatea nu mai este asigurata.
9

O alta caracteristica a sortarii prin insert, ie este faptul ca pentru fiecare


comparat, ie efectuata se realizeaza deplasarea unui element cu o singura
pozit, ie. Aceasta nseamna eliminarea a cel mult unei inversiuni, adica aranjarea n ordinea dorita (dar nu neaparat pe pozit, iile finale) ale unei perechi
de elemente.
Cum n cazul cel mai defavorabil, cel al unui s, ir ordonat descrescator,
sunt npn  1q{2 inversiuni rezulta ca sunt necesare tot atatea comparat, ii.
Aceasta nseamna ca orice algoritm de sortare bazat pe transformari locale
(interschimbari ntre elemente vecine) apart, ine lui Opn2 q. Pentru reducerea
ordinului de complexitate ar trebui sa se realizeze interschimbari ntre elemente care nu sunt neaparat vecine.

4.2
4.2.1

Sortare prin select, ie


Descriere s, i implementare

Ideea de baza a acestei metode este:


Pentru fiecare pozit, ie i, ncepand cu prima, se selecteaza din subtabloul ce
ncepe cu acea pozit, ie cel mai mic element s, i se amplaseaza pe locul respectiv
(prin interschimbare cu elementul curent de pe pozit, ia i).
Ciclul for continua pana la n  1 deoarece subtabloul xrn..ns cont, ine
un singur element care este plasat chiar pe pozit, ia potrivita, ca urmare a
interschimbarilor efectuate anterior.[4]
Algoritmul n pseudocod este urm
atorul:
Subalgoritm select, ieprealxr1..nsq
for i 1, n  1 do
ki
for j i 1, n do
if xrk s xrj s then
kj
end if
end for
if k  i then
xrk s xris
end if
end for
returnpxr1..nsq
Aratam ca un invariant al cuclului exterior (dupa i) este: xr1..i  1s este
ordonat crescator s, i xri  1s xrj s pentru j  i..n. La nceput i  1 deci
10

xr1..0s este un tablou vid. Ciclul for interior (dupa j) determina pozit, ia
minimului din xri..ns.
Aceasta este plasata prin interschimbare pe pozit, ia i. Se obt, ine astfel ca
xr1..is este ordonat crescator s, i ca xris xrj s pentru j  i 1, n. Dupa
incrementarea lui i (la sfars, itul ciclului dupa i) se reobt, ine proprietatea invarianta
La final i  n, iar invariantul conduce la xr1..n  1s crescator s, i xrn  1s
xrns adica xr1..ns este sortat crescator.
Algoritmul n C este urm
atorul:
1

#i n c l u d e <s t d i o . h>

2
3
4
5

i n t main ( )
{
i n t a r r a y [ 1 0 0 ] , n , c , d , p o s i t i o n , swap ;

6
7
8

p r i n t f ( Enter number o f e l e m e n t s \n ) ;
s c a n f ( %d , &n ) ;

9
10

p r i n t f ( Enter %d i n t e g e r s \n , n ) ;

11
12
13

f o r ( c = 0 ; c < n ; c++ )
s c a n f ( %d , &a r r a y [ c ] ) ;

14
15
16
17

for ( c = 0 ; c < ( n
{
position = c ;

1 ) ; c++ )

18

f o r ( d = c + 1 ; d < n ; d++ )
{
i f ( array [ p o s i t i o n ] > array [ d ] )
position = d;
}
i f ( p o s i t i o n != c )
{
swap = a r r a y [ c ] ;
array [ c ] = array [ p o s i t i o n ] ;
a r r a y [ p o s i t i o n ] = swap ;
}

19
20
21
22
23
24
25
26
27
28
29
30

31
32
33
34

p r i n t f ( S o r t e d l i s t i n a s c e n d i n g o r d e r : \ n ) ;
f o r ( c = 0 ; c < n ; c++ )
p r i n t f ( %d\n , a r r a y [ c ] ) ;

35

11

return 0;

36
37

4.2.2

Analiza complexit
at, ii sort
arii prin select, ie

Indiferent de aranjarea init, iala a elementelor, numarul de comparat, ii efectuate este:


Tc pnq 

n 1

 

i 1j 1 1

1

pn  iq  npn2 1q  npn2 1q

n 1

i 1

In cazul cel mai favorabil (s, ir ordonat crescator) numarul interschimbarilor


este TM pnq  0. In cazul cel mai defavorabil (s, ir ordonat descrescator)pentru
fiecare i se efectueaza o interschimbare (trei atribuiri), deci costul corespunzator modificariielementelor tabloului este TM pnq  3 in11 1  3pn  1q.
Luand n considerare atat comparat, iile cat s, i atribuirile se obt, ine ca algoritmul sortarii prin select, ie apart, ine clasei pn2 q.

4.2.3

Propriet
at, i ale sort
arii prin select, ie

Algoritmul este part, ial natural (numarul de comparat, ii nu depinde de gradul


de sortare al s, irului). In varianta prezentata (cand minimul este interschimbat cu pozit, ia curenta) algoritmul nu este stabil.
Daca nsa n locul unei singure interschimbari s-ar realiza deplasarea elementelor subtabloului xri..k  1s la dreapta cu o pozit, ie (ca n algoritmul
insert, iei), iar xrk s (salvat n prealabil ntr-o variabila auxiliara) s-ar transfera
n xris, algoritmul ar deveni stabil.

4.3
4.3.1

Sortarea rapid
a Quicksort
Descriere s, i implementare

Exista doua variante de sortare bazate pe descompunerea s, irului init, ial n


doua subsecvent, e: una care foloses, te un element pivot iar alta care foloses, te
o pozit, ie de partit, ionare. Acest tip de sortare este cunoscuta sub numele de
sortare rapida (quicksort) s, i a fost dezvoltata de Hoare.
Diferent, a dintre cele doua variante este mica: n prima varianta n prelucrarea de partit, ionare se asigura s, i plasarea pe pozit, ia q a valorii finale pe
cand n a doua doar se determina pozit, ia de partit, ionare. QUICKSORT
pe element pivot

12

Algoritmul n pseudocod este urm


atorul:
Subalgoritm quicksortpxrli..lssq
if li ls then
q partitiepxrli..lssq
xrli..q  1s quicksortpxrli..q  1sq
xrq 1..lss quicksortpxrq 1..lssq
end if
return xrli..lss
partitiepxrli..lssq
v xrlss
i li  1
j ls
while i j do
repeat
ii 1
until xris v
repeat
j j1
unti xrj s v
if i j then
xris xrj s
end if
end while
xris xrlss
return i
Pentru a justifica corectitudinea algoritmului partit, ie1 consideram asert, iunea:
daca i j atunci xrk s v pentru k  li..i iar xrk s v pentru k  j..l iar
daca i j atunci xrk s v pentru k  li..i iar xrk s v pentru k  j 1..ls.
Cum precondit, ia este li ls, deci i j s, i postcondit, iile sunt xrk s xris
pentru k  1..i  1, xrk s xris pentru k  i 1..ls, se poate arata ca
asert, iunea de mai sus este invarianta n raport cu prelucrarea repetitiva while
iar dupa efectuarea ultimei interschimbari implica postcondit, iile.

13

Algoritmul n C este urm


atorul:
1

#i n c l u d e <s t d i o . h>

2
3
4

void q u i c k s o r t ( i n t [ ] , int , i n t ) ;
int p a r t i t i o n ( int [ ] , int , int ) ;

5
6
7
8
9
10
11

i n t main ( )
{
int a [50] ,n , i ;
p r i n t f ( How many e l e m e n t s ? ) ;
s c a n f ( %d ,&n ) ;
p r i n t f ( \ nEnter a r r a y e l e m e n t s : ) ;

12

f o r ( i =0; i <n ; i ++)


s c a n f ( %d ,&a [ i ] ) ;

13
14
15

q u i c k s o r t ( a , 0 , n  1) ;
p r i n t f ( \ nArray a f t e r s o r t i n g : ) ;

16
17
18

f o r ( i =0; i <n ; i ++)


p r i n t f ( %d , a [ i ] ) ;

19
20
21

return 0;

22
23

24
25
26
27
28
29
30
31
32
33
34

void q u i c k s o r t ( i n t a [ ] , i n t l , i n t u)
{
int j ;
i f ( l <u )
{
j=p a r t i t i o n ( a , l , u ) ;
q u i c k s o r t ( a , l , j  1) ;
q u i c k s o r t ( a , j +1,u ) ;
}
}

35
36
37
38
39
40
41

int partition ( int a [ ] , int l , int u)


{
i n t v , i , j , temp ;
v=a [ l ] ;
i=l ;
j=u+1;

42
43
44
45

do
{
do

14

i ++;

46
47

w h i l e ( a [ i ]<v&&i<=u ) ;

48
49

do

50

j ;
w h i l e ( v<a [ j ] ) ;

51
52
53

i f ( i <j )
{
temp=a [ i ] ;
a [ i ]=a [ j ] ;
a [ j ]=temp ;
}
} w h i l e ( i <j ) ;

54
55
56
57
58
59
60
61

a [ l ]=a [ j ] ;
a [ j ]=v ;

62
63
64

return ( j ) ;

65
66

4.3.2

Analiza complexit
at, ii - Quicksort

Pe parcursul partit, ionarii, numarul de comparat, ii depas, es, te n general numarul


de interschimbari, motiv pentru care vom analiza doar numarul de comparat, ii
efectuate. Pentru un s, ir de lungime n numarul de comparat, ii efectuate n
cele doua cicluri repeat din partit, ionare n i  j(i s, i j fiind valorile finale ale
contoarelor). Astfel, daca i  j se vor efectua n comparat, ii iar daca i  j 1
se vor efectua n 1 comparat, ii.
Influent, a majora asupra numarului de comparat, ii efectuate de catre algoritmul quicksort-ului o are raportul dintre dimensiunile celor doua subs, iruri
obt, inute dupa partit, ionare. Cu cat dimensiunile celor doua subs, iruri sunt
mai apropiate cu atat se reduce numarul comparat, iilor efectuate. Astfel
cazurile cele mai favorabile corespund partit, ionarii echilibrate iar cele mai
put, in favorabile partit, ionarii dezechilibrate. [5]
Analiza n cazul cel mai favorabil. Presupunem ca la fiecare partit, ionare
a unui s, ir de lungimi n se obt, in doua subsecvent, e de lungimi rn{2s respectiv
n  rn{2s  1 iar numarul de comparat, ii din partit, ionare este n. In aceste
condit, ii putem considera ca marginea superioara a numarului de comparat, ii
satisface o relat, ie de recurent, a de forma T pnq  2T pn{2q n ceea ce conduce
prin teorema master la o complexitate de ordin nlgn. Prin urmare n cazul
cel mai favorabil ordinul de complexitate a algoritmului quicksort este nlgn,
adica algoritmul apart, ine lui pnlgnq.
15

Analiza n cazul cel mai defavorabil.Presupunem ca la fiecare partit, ionare


se efectueaza n+1 comparat, ii s, i ca se genereaza un subs, ir vid s, i unul de
lungime n  1.Atunci relat, ia de recurent, a corespunzatoare este T pnq  T pn 
1q n 1.
Aplicand metoda iterat, iei se obt, ine T pnq  pn 1qpn 2q{2  3. Se
obt, ine astfel ca n cazul cel mai defavorabil complexitatea este patratica,
adica sortarea rapida apart, ine clasei Opn2 q. Spre deosebire de metodele elementare de sortare pentru care un s, ir init, ial sortat conducea la un numar
minim de prelucrari n acest caz tocmai aceste situat, ii conduc la costul
maxim(pentru un s, ir deja ordonat la fiecare partit, ionare se obt, ine pivotul
pe ultima pozit, ie).
Pentru a evita partit, ionarea dezechilibrata au fost propuse diverse variante de alegere a valorii pivotului, una dintre acestea constand n select, ia a
trei valori din s, ir s, i alegerea ca valoare a pivotului a medianei acestor valori
(valoarea aflata pe a doua pozit, ie n tripletul ordonat).
In cazul nefavorabil, cand cele doua sub-liste au dimensiunea 1 s, i n  1
arborele construit de catre apelurile recursive devine liniar. Astfel relat, ia de
recurent, a va fi:
T pnq  Opnq T p0q T pn  1q

care va rezulta n T pnq  Opn2 q.


Analiza n cazul mediu. Se bazeaza pe ipoteza ca toate cele n pozit, ii ale
s, irului au aceeas, i probabilitate de a fi selectate ca pozit, ie pivot (probabilitatea este n acest caz 1{n).
Presupunand ca la fiecare partit, ionare a unui s, ir de lungime n se efectueaza
n 1 comparat, ii, numarul de comparat, ii efectuate n cazul n care pozit, ia
pivotului este q satisface:
Tq pnq  T pq  1q

T pn  q q

Prin urmare numarul mediu de comparat, ii este de ordinul 2nlnn  1.38nlgn.


Aceasta nseamna ca n cazul mediu sortarea rapida este doar cu 38% mai
costisitoare decat n cazul cel mai favorabil.
In cazul nefavorabil, cand cele doua sub-liste au dimensiunea 1 s, i n  1
arborele construit de catre apelurile recursive devine liniar. Astfel relat, ia de
recurent, a va fi:
T pnq  Opnq T p0q T pn  1q

care va rezulta nT pnq  Opn2 q


De ment, ionat ca spat, iul n memorie folosit de catre Quicksort este Oplognq
, chiar s, i n cazul nefavorabil.

16

Prin urmare numarul mediu de comparat, ii satisface:


Tm pnq 

1 n
Tq pnq  pn
n q1

 pn
Scazand ntr ele relat, iile:
nTm pnq  2

1 n
pTmpq  1q
n q 1

1q

2 n
Tm pq  1q
n q 1

1q

Tm pn  q qq 

Tm pq  1q

q 1

pn  1qTmpn  1q  2

n 1

npn

Tm pq  1q

1q

pn  1qn

q 1

se obt, ine relat, ia de recurent, a pentru Tm :


nTm pnq  pn

1qTm pn  1q

2n

Aplicand metoda iterat, iei s, i prin nsumare se obt, ine :


Tm n  2pn
2pn
4.3.3

1q

1qp1{n

1
n

i
i3

1{pn  1q

2  2pn

..

1{3q

1qpln n  ln3q

2
2

Propriet
at, i ale sort
arii rapide

descompunerea s, irului init, ial n doua subsecvent, e;


ordonarea fiecareia dintre acestea folosind aceeas, i tehnica;
combinarea subsecvent, elor ordonate pentru a obt, ine varianta ordonata
a s, irului total.

4.4
4.4.1

Sortarea prin interclasare(merging)


Descriere s, i implementare

S, irul px1 , x2 , ..., xn q se descompune n doua subsecvent, e de lungimi cat mai


apropiate: px1 , ..., xn{2 q s, i pxpn{2q 1 , ..., xn q; se ordoneaza fiecare dintre subsecvent, e
aplicand aceeas, i tehnica; se construies, te s, irul final ordonat parcurgand cele
doua subsecvent, e s, i preluand elemente din ele astfel ncat sa fie respectata
relat, ia de ordine (aceasta prelucrare se numes, te interclasare).
17

Algoritmul n pseudocod este urm


atorul:
mergesortpxrli..lssq
if li ls then
m  pli lsq{2
xrli..ms mergesortpxrli..msq
xrm 1..lss mergesortpxrm 1..lssq
xrli..lss mergesortpxrli..ms, xrm 1..lssq,
end if
return xrli..lss
mergepxrli..ms, xrm 1..lssq
i li
jm 1
k0
while i m and j ls do
if xris xrj s then
kk 1
crk s xris
ii 1
else
kk 1
cr k s x r j s
jj 1
end if
end while
while j m do
kk 1
crk s xris
ii 1
end while
while j ls do
kk 1
cr k s x r j s
jj 1
end while
return cr1..k s
Precondit, iile-mergesort : xrli..ms crescator s, ixrm
18

1..lsscrescator, iar

postcondit, ia este: cr1..p q s este crescator. Pentru a demonstra ca algoritmul


asigura satisfacerea postcondit, iei este suficient sa se arate ca cr1..k s este
crescator, k  i j  2 este proprietate invarianta pentru fiecare dintre cele
trei prelucrari repetitive.
Algoritmul n C este urm
atorul:
1
2
3
4
5
6
7
8

// Merges two s u b a r r a y s o f a r r [ ] .
// F i r s t s u b a r r a y i s a r r [ l . .m]
// Second s u b a r r a y i s a r r [m+ 1 . . r ]
v o i d merge ( i n t a r r [ ] , i n t l , i n t m, i n t r )
{
int i , j , k ;
i n t n1 = m  l + 1 ;
i n t n2 = r  m;

9
10

i n t L [ n1 ] , R[ n2 ] ;

11
12
13
14
15

for ( i =
L[ i ]
for ( j =
R[ j ]

0 ; i < n1 ; i ++)
= arr [ l + i ] ;
0 ; j < n2 ; j ++)
= a r r [m + 1+ j ] ;

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

i = 0 ; // I n i t i a l i n d e x o f f i r s t s u b a r r a y
j = 0 ; // I n i t i a l i n d e x o f s e c o n d s u b a r r a y
k = l ; // I n i t i a l i n d e x o f merged s u b a r r a y
w h i l e ( i < n1 && j < n2 )
{
i f (L [ i ] <= R[ j ] )
{
arr [ k ] = L[ i ] ;
i ++;
}
else
{
a r r [ k ] = R[ j ] ;
j ++;
}
k++;
}

34
35
36
37
38
39
40

w h i l e ( i < n1 )
{
arr [ k ] = L[ i ] ;
i ++;
k++;
}

19

w h i l e ( j < n2 )
{
a r r [ k ] = R[ j ] ;
j ++;
k++;
}

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

}
/ l i s f o r l e f t i n d e x and r i s r i g h t i n d e x o f t h e
suba r r a y o f a r r t o be s o r t e d /
v o i d mergeSort ( i n t a r r [ ] , i n t l , i n t r )
{
if (l < r)
{
// Same a s ( l+r ) / 2 , but a v o i d s o v e r f l o w f o r
// l a r g e l and h
i n t m = l +(r  l ) / 2 ;

57

// S o r t f i r s t and s e c o n d h a l v e s
mergeSort ( a r r , l , m) ;
mergeSort ( a r r , m+1, r ) ;

58
59
60
61

merge ( a r r , l , m, r ) ;

62

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

}
/ Function t o p r i n t an a r r a y /
void printArray ( i n t A[ ] , i n t s i z e )
{
int i ;
f o r ( i =0; i < s i z e ; i ++)
p r i n t f ( %d , A[ i ] ) ;
p r i n t f ( \n ) ;
}
/ D r i v e r program t o t e s t above f u n c t i o n s /
i n t main ( )
{
i n t arr [ ] = {12 , 11 , 13 , 5 , 6 , 7};
int a r r s i z e = s i z e o f ( arr )/ s i z e o f ( arr [ 0 ] ) ;

78

p r i n t f ( Given a r r a y i s \n ) ;
printArray ( arr , a r r s i z e ) ;

79
80
81

mergeSort ( a r r , 0 , a r r s i z e

82

1) ;

83

p r i n t f ( \ n S o r t e d a r r a y i s \n ) ;
printArray ( arr , a r r s i z e ) ;
return 0;

84
85
86
87

20

4.4.2

Analiza complexit
at, ii Mergesort

Contorizand numarul de comparat, ii pTC pp, q qq s, i cel de transferuri ale elementelor pTM pp, q qq se obt, ine: TC pp, q q P pminpp, q qq (n cazul cel mai
favorabil), TC pp, q q P Opp q  1q(n cazul cel mai defavorabil) iar TM pp, q q P
pp q q.[6]
Atat n cazul favorabil cat s, i n cel nefavorabil, Mergesort are un timp de
execut, ie de Opnlog pnqq . Relat, ia de recurent, a a algoritmului va fi: T pnq 
0, n  1s, iT pn{2q T pn{2q n, n 1
Deoarece avem nevoie de T pn{2q timp pentru a sorta fiecare sub-lista s, i de
n timp pentru operat, ia de interclasare (merge). Mai jos avem o reprezentare
grafica a arborelui de recurent, a pentru Mergesort. Ment, ionam ca spat, iul n
memorie folosit de catre Mergesort este Opnq .

4.4.3

Propriet
at, i ale Mergesort

In algoritmul mergesort, suma marimilor subcazurilor este egala cu marimea


cazului init, ial. Aceasta proprietate nu este n mod necesar valabila pentru
algoritmii divide et impera. Oare de ce este nsa important ca subcazurile sa
fie de marimi cat mai egale? Daca n mergesort l separam pe T n tabloul
U avand n  1 elemente s, i tabloul V avand un singur element, se obt, ine un
nou timp de execut, ie, care este n pn2 q. Deducem de aici ca este esent, ial ca
subcazurile sa fie de marimi cat mai apropiate (sau, alfel spus, subcazurile
sa fie cat mai echilibrate).

21

Compararea teoretic
a a algoritmilor

Sortare prin interclasare are complexitatea Opn  log2nq. Desi acest algoritm este stabil si necesita cu 30% mai putine comparatii decat sortarea
rapida, metoda este mai lenta decat sortarea rapida datorita faptului ca
efectueaza mai multe interschimbari. Dezavantajul metodei de sortare prin
interclasare este ca necesita un vector auxiliar de marimea originalului. Problema apare cand vectorul este mare si spatiu este un factor critic.
Sortarea prin metoda selectiei si sortarea prin metoda bulelor au
aceeasi complexitate, si anume , nsa performantele sortarii prin metoda
selectiei sunt cu 60% mai bune decat sortarea prin metoda bulelor.
Sortarea prin insertie direct
a are tot complexitatea Opn2 q , dar este
de peste 2 ori mai eficienta decat algoritmul prin metoda bulelor.[3]

Compararea experimental
a a algoritmilor

Comparat, ia experimentala a fost facuta pe:


Sistem de operare: Windows 10 Home
RAM: 4 GB
Processor: Intel x-64 Core i5 2.3 Ghz
Compilator: CodeBlocks
Limbaj de programare: C
Am ales elemente random pentru fiecare algoritm s, i am obt, inut urmatoarele
rezultate :
Pentru sortarea prin insert, ie:
Elemente Secunde
10
0.0022
100
0.0022
500
0.0040
1000
0.0046
10000
0.1639
50000
3.0000
100000
11.2078
200000
47.3297
500000
240.0738
22

Pentru sortarea prin select, ie:


Elemente Secunde
2000
0.1342
4000
0.4523
8000
1.5140
16000
5.6323
32000
23,2055
Pentru sortarea rapid
a:
Elemente Secunde
1000
0.0050
10000
0.0.072
50000
0.0124
100000
0.2020
1000000
0.2028
2000000
0.4458
5000000
1.0088
Pentru sortarea prin interclasare:
Elemente Secunde
1000
0.0056
10000
0.0116
50000
0.3640
100000
0.1370
200000
0.1352
1000000
0.6718
2000000
1.2956
5000000
3.3035
Concluzii:
Din experiment putem spune cu certitudine ca sortarea prin insert, ie ar
necesita mult timp pentru a sorta un set de date mai mari (de exemplu
100000) dar este mai rapida atunci cand taboul este mic.
Sortarea prin intercalsare s, i sortarea rapida sunt potrivite pentru dimensiuni mai mari de intrare, dar sortarea rapida are aceleas, i performat, e ca s, i
sortarea prin insert, ie cand este vorba de un tabou mic.
Din experimentul nostru rezulta ca sortarea rapida este mai performanta
decat sortarea prin insert, ie sortare prin select, ie s, i sortarea prin interclasare .
23

Declarat, ie de originalitate

Subsemnatul(a) Dana Madalina Enachiuc, declar pe proprie raspundere ca


Lucrarea de licenta/Lucrarea de disertatie cu titlul Aloritmi de sortare, a
fost elaborata de mine, ca rezultat al propriei cercetari si documentari, nu a
mai fost prezentata niciodata la o alta facultate sau institutie de nvatamant
superior, din tara sau strainatate, si nu a fost niciodata publicata sub forma
de articol sau volum de catre edituri/reviste din tara sau strainatate.
De asemenea, declar ca toate sursele bibliografice utilizate, inclusiv cele
de pe Internet, sunt indicate n lucrare, cu respectarea regulilor de evitare a
plagiatului/autoplagiatului:
Toate fragmentele de text reproduse exact, chiar si n traducere proprie
din alta limba, sunt redate ntre ghilimele si detin referinta precisa a
sursei bibliografice;
Reformularea, n cuvinte proprii, a textelor scrise de catre alti autori
indica sursa bibliografica din care s-au inspirat;
Rezumarea ideilor altor autori detine referinta precisa la textul original;
Calculele (daca este cazul) sunt efectuate de mine, iar comentarea rezultatelor obtinute este originala;
Reprezentarile grafice care nu mi apartin au indicata sursa bibliografica
exacta;
In cazul n care, n calitate de (co)autor, am prezentat deja o parte din
aceasta lucrare n cadrul unor manifestari stiintifice (congrese, conferinte,
colocvii, mese rotunde) din tara sau strainatate, am folosit autocitarea.
Prin prezenta, mi asum n totalitate originalitatea lucrarii elaborate.

24

References
[1] R. Potop, Analiza algoritmilor de sortare pe arhitecturi paralele.
[2] T. I. Anutei, Limbaj algortmic.
[3] N. Secita, Metode de sortare, Spell IT, vol. 2, no. 2.
[4] G. Hazi, Proiectarea algoritmilor, 2007.
[5] D. Zaharie, Introducere n proiectarea s, i analiza algoritmilor, ed eubeea, 2008.
[6] R. Andone and I. Garbacea, Algoritmi fundamentali, O perspectiva
C++. Editura Libris, Cluj Napoca, 1995.

25

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