Documente Academic
Documente Profesional
Documente Cultură
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
Introducere
3.1
Select, ie:
Interclasare (merging):
Merge-sort
Timsort este un hibrid ntre Mergesort s, i Insertion sort
Distribuire:
Bucket-sort
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
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]
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
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
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
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
Propriet
at, i ale sort
arii prin insert, ie
4.2
4.2.1
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
n 1
i 1j 1 1
1
pn iq npn2 1q npn2 1q
n 1
i 1
4.2.3
Propriet
at, i ale sort
arii prin select, ie
4.3
4.3.1
Sortarea rapid
a Quicksort
Descriere s, i implementare
12
13
#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
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
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
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
T pn q q
16
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
1qTm pn 1q
2n
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
4.4
4.4.1
1..lsscrescator, iar
// 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
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
Declarat, ie de originalitate
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