Documente Academic
Documente Profesional
Documente Cultură
k i k
k i
k
i
1 2 =
k
n
Structuri de Date 2013 - 2014 17
complexitate algoritm de sortare
4 2 ) 2 ( 2 2
1
1
0
+ =
+
k i
k
i
k i
) log ( 2 log 2 ) (
heapSort
n n O n n n n T = =
Paradigma divide-et-impera
P(n): problem de dimensiune n
baza:
dac n n
0
atunci rezolv P prin metode
elementare
divide-et-impera:
divide P n a probleme P (n ), ..., P (n ) cu
Structuri de Date 2013 - 2014 18
divide P n a probleme P
1
(n
1
), ..., P
a
(n
a
) cu
n
i
n/b, b > 1
rezolv P
1
(n
1
), ..., P
a
(n
a
) in aceeai manier
i obine soluiile S
1
, ..., S
a
asambleaz S
1
, ..., S
a
pentru a obine soluia
S a problemei P
Paradigma divide-et-impera: algoritm
procedure DivideEtImpera(P, n, S)
begin
if (n <= n0) then
determina S prin metode elementare
else
Structuri de Date 2013 - 2014 19
imparte P in P1, ..., Pa
DivideEtImpera(P1, n1, S1)
...
DivideEtImpera(Pa, na, Sa)
Asambleaza(S1, ..., Sa, S)
end
Sortare prin interclasare (Merge sort)
generalizare: a[p..q]
baza: p q
divide-et-impera
divide: m = [(p + q)/2]
subprobleme: a[p..m], a[m+1..q]
asamblare: interclaseaz subsecvenele sortate
Structuri de Date 2013 - 2014 20
asamblare: interclaseaz subsecvenele sortate
a[p..m] i a[m+1..q]
iniial memoreaz rezultatul interclasrii n temp
copie din temp[0..p+q-1] in a[p..q]
complexitate:
timp : T(n) = O(n log n)
spaiu suplimentar: O(n)
Interclasarea a dou secvene sortate
problema:
date a[0] a[1] a[m-1],
b[0] b[1] b[n-1],
s se construiasc c[0] c[1] c[m+n-1]
a.. ( k)((i)c[k]=a[i]) (j)c[k]=b[j]) iar pentru
k!=p, c[k] i c[p] provin din elemente diferite
soluia
iniial: i 0, j 0, k 0
Structuri de Date 2013 - 2014 21
iniial: i 0, j 0, k 0
pasul curent:
daca a[i] b[j]
atunci c[k] a[i], i i+1
daca a[i] > b[j]
atunci c[k] b[j], j j+1
k k+1
condiia de terminare: i > m-1 sau j > n-1
daca e cazul, copie n c elementele din tabloul neterminat
Sortare rapid (Quick sort)
generalizare: a[p..q]
baza: p q
divide-et-impera
divide: determin k ntre p i q prin
interschimbri a.. dup determinarea lui k
avem:
Structuri de Date 2013 - 2014 22
avem:
p i k a[i] a[k]
k < j q a[k] a[j]
subprobleme: a[p..k-1], a[k+1..q]
asamblare: nu exist
x
k p q
x
x
Quick sort: partiionare
iniial:
x a[p] (se poate alege x arbitrar din a[p..q])
i p+1 ; j q
pasul curent:
dac a[i] x atunci i i+1
dac a[j] x atunci j j-1
dac a[i] > x > a[j] si i < j atunci
Structuri de Date 2013 - 2014 23
dac a[i] > x > a[j] si i < j atunci
swap(a[i], a[j])
i i+1
j j-1
terminare:
condiia i > j
operaii k i-1
swap(a[p], a[k])
Quick sort: partiionare - exemplu
10 10 22 14 14 55 11 17 17 33 77 x = 10
i j
10 10 22 14 14 55 11 17 17 33 77
10 10 22 77 55 11 17 17 33 14 14
p
q
procedure partitioneaza(a, p, q, k)
begin
x a[p]
i p+1
j q
while (i <= j) do
if (a[i] <= x) then i i+1
Structuri de Date 2013 - 2014 24
10 10 22 77 55 11 17 17 33 14 14
10 10 22 77 55 11 33 17 17 14 14
33 22 77 55 11 10 10 17 17 14 14
i j
if (a[i] <= x) then i i+1
if (a[j] >= x) then j j-1
if (i<j) and (a[i]>x) and (x>a[j]) then
swap(a[i], a[j])
i i+1
j j-1
k i-1
a[p] a[k]
a[k] x
end
Quick sort: recursie - exemplu
partiionare
10 10 22 14 14 55 11 17 17 33 77 x = 10
i j
p q
procedure quickSort(a, p, q)
begin
while (p < q) do
partitioneaza(a, p, q, k)
quickSort(a, p, k-1)
Structuri de Date 2013 - 2014 25
[p,k) (k,q]
recursie
... ...
k
33 22 77 55 11 10 10 17 17 14 14
quickSort(a, p, k-1)
quickSort(a, k+1, q)
end
Quick sort: arbore de recursie
10 2 14 5 1 17 3 7 3 2 7 5 1 10 17 14 1 2 3 5 7 10 14 17
3 2 7 5 1 1 2 3 5 7 1 2 3 5 7
17 14
14 17 14 17
Structuri de Date 2013 - 2014 26
1 2 1 2 1 2 5 7 5 7 5 7
2 2 2
7 7 7
17 17 17
Alegerea pivotului influeneaz eficiena
algoritmului
Cazul cel mai nefavorabil: pivotul este cea mai
mic (cea mai mare valoare). Timp proporional
cu n + n-1 + ... + 1.
T
quickSort
(n) = O(n
2
)
Quick sort - complexitate
quickSort
Arborele de
recursie:
Structuri de Date 2013 - 2014 27
...
n elemente
n-1 elemente
n-2 elemente
n-3 elemente
2 elemente
1 elemet
Quick sort - complexitate
Un pivot bun imparte tabloul n dou
subtablouri de dimensiuni comparabile
nlimea arborelui de recursie este O(log n)
Complexitatea medie este O(n log n)
Structuri de Date 2013 - 2014 28
...
n elemente
n/2 elemente
2 elemente
1 element
n/2 elemente
1 element
...
1 element
1 element
...
...
2 elemente
Sortare prin numrare
a[i] {1, 2,..., k}
Se dermin poziia fiecrui element n tabloul
sortat numrnd cte elemente sunt mai mici
dect el.
Algoritm:
1. procedure countingSort(a, b, n, k)
2. begin 2. begin
3. for i 1 to k do c[i] 0
4. for j 0 to n-1 do c[a[j]] c[a[j]] + 1
5. for i 2 to k do c[i] c[i] + c[i-1]
6. for j n-1 downto 0 do
7. b[c[a[j]]-1] a[j]
8. c[a[j]] c[a[j]] - 1
9. end
Structuri de Date 2013 - 2014 29
O(k+n)
Sortare prin numrare exemplu (k=6)
0 1 2 3 4 5 6 7
a 3 6 4 1 3 4 1 4
1 2 3 4 5 6
c 2 0 2 3 0 1 linia 4
1 2 3 4 5 6
c 2 2 4 7 7 8 linia 5
0 1 2 3 4 5 6 7
b 4
0 1 2 3 4 5 6 7
b 1 4
0 1 2 3 4 5 6 7
b 1 4 4
Structuri de Date 2013 - 2014 30
b 4
1 2 3 4 5 6
c 2 2 4 6 7 8
liniile 6-8, j = 7
b 1 4
1 2 3 4 5 6
c 1 2 4 6 7 8
liniile 6-8, j = 6
b 1 4 4
1 2 3 4 5 6
c 1 2 4 5 7 8
liniile 6-8, j = 5
0 1 2 3 4 5 6 7
b 1 1 3 3 4 4 4 6 tabloul sortat:
Sortare prin distribuire
Elementele a[i] sunt distribuite uniform
peste intervalul [0,1)
Principiu:
se divide intervalul [0,1) n n subintervale de
mrimi egale, numerotate de la 0 la n-1; mrimi egale, numerotate de la 0 la n-1;
se distribuie elementele a[i] n intervalul
corespunztor: ;
se sorteaz fiecare pachet folosind o alt
metod;
se combin cele n pachete ntr-o list sortat.
Structuri de Date 2013 - 2014 31
] [i a n
Sortare prin distribuire
Algoritm:
1. procedure bucketSort(a, n)
2. begin
3. for i 0 to n-1 do
4. insereaz( B[ ], a[i])
] [i a n
4. insereaz( B[ ], a[i])
5. for i 0 to n-1 do
6. sorteaza lista B[i]
7. concateneaz n ordine listele B[0],
B[1], ..., B[n-1]
8. end
Structuri de Date 2013 - 2014 32
] [i a n
Complexitatea medie: O(n)
Sortare prin distribuire exemplu
Structuri de Date 2013 - 2014 33
(Cormen T.H. et al., Introducere n algoritmi)
Sortare - complexitate
Algoritm
Caz
favorabil mediu nefavorabil
bubbleSort
n n
2
n
2
insertSort
n n
2
n
2
naivSort
n
2
n
2
n
2
Structuri de Date 2013 - 2014 34
naivSort
n n n
heapSort
n log n n log n n log n
mergeSort
n log n n log n n log n
quickSort
n log n n log n n
2
countingSort
- n + k n + k
bucketSort
- n -