Académique Documents
Professionnel Documents
Culture Documents
sortare interna
“buble sort”
sortare prin insertie
sortare pri selectie
naiva
sistematica (“heap sort”)
sortare prin interclasare (“merge sort”)
sortare rapida (“quick sort”)
cautare
in liste liniare
cautare binara – aspectul dinamic
arbori AVL
Dorel Lucanu Algoritmica si programare
Problema sortarii
Forma 1
Intrare: n, (R0, . . . , Rn-1) cu cheile
k0, . . . , kn-1
Iesire: (R’0, . . . , R’n-1) astfel incit
(R’0, . . . , R’n-1) este o permutare a
(R0, . . . , Rn-1 ) si R’0.k0 . . . R’n-1.kn-1
Forma 2
Intrare: n, (v0, . . . , vn-1)
Iesire: (w0, . . . , wn-1) astfel incit
(w0, . . . , wn-1) este o permutare a
(v0, . . . , vn-1), si w0 . . . wn-1
structura de date
array a[0..n-1]
a[0] = v0, . . . , a[n-1] = vn-1
exemplu
analiza
cazul cel mai nefavorabil
a[0] > a[1] > ... > a[n-1]
TbubleSort(n) = O(n2)
exemplu
analiza
cazul cel mai nefavorabil
a[0] > a[1] > ... > a[n-1]
TinsertSort(n) = O(n2)
ideea de baza
pasul curent: selecteaza un element si-l
duce pe pozitia sa finala din tabloul sortat
repeta pasul curent pana cnd toate
elementele ajung pe locurile finale
idee
(i ) 0 i < n a[i] = max{a[0],…,a[i]}
algoritm
procedure naivSort(a, n)
begin
for i n-1 downto 0 do
imax i
for j i-1 downto 0 do
if (a[j] > a[imax])
then imax j
if (i imax) then swap(a[i], a[imax])
end
complexitatea timp toate cazurile:
TnaivSort(n) = Θ(n2)
Dorel Lucanu Algoritmica si programare
"Heap sort" (sortare prin selectie sistematica)
etapa I
organizeaza tabloul ca un max-heap
initial tablou satisface proprietatea max-
heap incepand cu n/2
introduce in max-heap elementele de pe
pozitiile n/2-1, n/2 -1, …, 1, 0
etapa II
selecteaza elementul maxim si-l duce la
locul lui prin interschimbare cu ultimul
micsoreaza cu 1 si apoi reface max-heapul
repeta pasii de mai sus pana cand toate
elementele ajung pe locul lor
procedure insereazaAlTlea(a, n, t)
begin
j t
heap false
while ((2*j+1 < n) and not heap) do
k 2*j+1
if ((k < n-1) and (a[k] < a[k+1]))
then k k+1
if (a[j] < a[k])
then swap(a[j], a[k])
j k
else heap true
end
Dorel Lucanu Algoritmica si programare
"Heap sort" (sortare prin selectie sistematica)
procedure heapSort(a, n)
begin
// construieste maxheap-ul
for t (n-1)/2 downto 0 do
insereazaAlTlea(a, n, t)
// elimina
r n-1
while (r > 0) do
swap(a[0], a[r])
insereazaAlTlea(a, r, 0)
r r-1
end
Dorel Lucanu Algoritmica si programare
"Heap sort" - complexitate
2
i 0
( k i 1) 2 i
2 k 1
2(k 1)
2i
i 0
2 i
( k 2) 2 k 1
4
procedure DivideEtImpera(P, n, S)
begin
if (n <= n0)
then determina S prin metode
elementare
else imparte P in P1, ..., Pa
DivideEtImpera(P1, n1, S1)
...
DivideEtImpera(Pa, na, Sa)
Asambleaza(S1, ..., Sa, S)
end
generalizare: a[p..q]
baza: p q
divide-et-impera
divide: m = [(p + q)/2]
subprobleme: a[p..m], a[m+1..q]
asamblare: interclaseaza subsecventele sortate
a[p..m] si a[m+1..q]
initial memoreaza rezultatul interclasarii in
temp
copie din temp[0..p+q-1] in a[p..q]
complexitate:
timp : T(n) = O(n log n) (T(n) = 2T(n/2)+n)
spatiu suplimentar: O(n)
Dorel Lucanu Algoritmica si programare
Interclasarea a doua secvente sortate
problema:
date a[0] a[1] … a[m-1],
b[0] b[1] … b[n-1],
sa se construiasca c[0] c[1] … c[m+n-1]
a.i. ( k)((i)c[k]=a[i]) (j)c[k]=b[j])
solutia
initial: 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
conditia de terminare: i > m-1 sau j > n-1
daca e cazul, copie elementele din tabloul neterminat
Dorel Lucanu Algoritmica si programare
Sortare rapida (Quick sort)
generalizare: a[p..q]
baza: p q
divide-et-impera
divide: determina k intre p si q prin
interschimbari a.i. dupa determinarea lui k
avem:
p i k a[i] a[k]
k < j q a[k] a[j]
x x x
p k q
subprobleme: a[p..k-1], a[k+1..q]
asamblare: nu exista
initial:
x a[p] (se poate alege x arbitrar din
a[p..q])
i p+1 ; j q
pasul curent:
daca a[i] x atunci i i+1
daca a[j] x atunci j j-1
daca a[i] > x > a[j] si i < j atunci
swap(a[i], a[j])
i i+1
j j-1
terminare:
conditia i > j
operatii k i-1
swap(a[p], a[k])
Dorel Lucanu Algoritmica si programare
Cautare
in liste liniare
cautare binara – aspectul dinamic
arbori AVL
T(p,m-1) T(m+1,q)
T = T(0,n-1)
2
n=6
0 4
1 3 5
function Poz(t, a)
begin
p t
while (p != NULL && p->val != a) do
if (a < p->val)
then p p->stg
else p p->drp
return p
end
cazul 1 sau 2
procedure elimCaz1sau2(t, predp, p)
begin
if (p = t)
then t devine vid sau unicul fiu al lui t devine
radacina
else if (p->stg = NULL)
then inlocuieste in predp pe p cu p->drp
else inlocuieste in predp pe p cu p->stg
end
0 0 40 40
40
30 50 30 50
10 30 50
20
20 insereaza(35) 20 insereaza(32)
40
40 40
30
30 30
35
35
32
Dorel Lucanu Algoritmica si programare
Arbori AVL
un arbore binar de cautare t este un arbore
AVL-echilibrat daca pentru orice virf v,
h(vstg) h(vdrp) 1
Lema
t AVL-echilibrat h(t) (log n).
Teorema
Clasa arborilor AVL-echilibrati este O(log n)
stabila.
algoritmul de inserare
nodurile au memorate si factorii de
echilibrare ( {1, 0, 1})
se memoreaza drumul de la radacina la
nodul adaugat intr-o stiva (O(log n))
se parcurge drumul memorat in stiva in
sens invers si se reechilibeaza nodurile
dezichilibrate cu una dintre operatiile:
rotatie stinga/dreapta simpla/dubla
(O(log n)).
Dorel Lucanu Algoritmica si programare
Rotatii
Rotatie dreapta simpla
y x
y
x
C A
A B B C