Documente Academic
Documente Profesional
Documente Cultură
LUCRARE DE LICEN
IULIE 2015
Ministerul Educaiei, Cercetrii, Tineretului i Sportului
Universitatea Ovidius din Constana
Facultatea de Matematic i Informatic
Specializarea Matematic - Informatic
Algoritmi de sortare i
cutare
IULIE 2015
CUPRINS
1. Introducere
2. Soratrea prin interclasare (Mergesort)
3. Sortarea prin inserie
4. Sortarea rapid (Quicksort)
5. Heapsort
6. Shellsort
7. Sortarea prin selecie
8. Bubble sort
9. Arbori binai de cutare
10. Arbori Rou Negru
11. Concluzii
12. Anex
Bibliografie
Capitolul 1
Introducere
Sortarea este o metod (un algoritm), prin intermediul careia se poate ordona o
anumit clas de obiecte concrete sau abstracte, dup unul sau mai multe criterii
impuse. Cutarea este o metod prin intermediul careia se poate cuta, dup criterii precizate,
un anumit obiect concret sau abstract ntr-o multime ordonat sau nu, de obiecte concrete sau
abstracte.
n realitate, domeniul sortrii i cutarii ofer un mijloc ideal pentru analiza unor game
largi de subiecte generale importante: oprimizarea algoritmilor i programelor, analiza
matematic a eficienei algoritmilor, metodele de cutare web cum ar fi Google, Yahoo,
MSN, etc. .
Prezenta lucrare este alctuit din 12 capitole n care sunt prezentate metodele de
sortare i cutare precum i programele aferente metodelor.
n capitolul al 3-lea este descris metoda de Sortare prin inserie. ncepnd cu al doi-
lea numr din ir, se repet urmtorul procedeu: inseram numrul de pe poziia j reinut ntr-o
1
2
cheie, in subsirul deja ordonat a [0], ..., a [j - 1] astfel nct s obinem subirul ordonat
a [0], ..., a [j]. Ne oprim cnd obinem subirul ordonat de n elemente.
2
Capitolul 2
Sortarea prin interclasare (Mergesort)
3
Exemplul 1: Interclasarea a dou iruri ordonate
Fie irurile:
A: 1 1 3 8 9 12 30
B: 3 5 7 9 11 23 30
C:
Pasul 1: Se compar primul element din A cu primul element din B i cel mai mic se adaug
n C. (1 < 3)
A: 1 3 8 9 12 30
B: 3 5 7 9 11 23 30
C: 1
Pasul 2: Se compar primul element din A cu primul element din B i cel mai mic se adaug
n C. (1 < 3)
A: 3 8 9 12 30
B: 3 5 7 9 11 23 30
C: 1 1
A: 8 9 12 30
B: 3 5 7 9 11 23 30
C: 1 1 3
A: 8 9 12 30
B: 5 7 9 11 23 30
C: 1 1 3 3
A: 8 9 12 30
B: 7 9 11 23 30
C: 1 1 3 3 5
4
A: 8 9 12 30
B: 9 11 23 30
C: 1 1 3 3 5 7
A: 9 12 30
B: 9 11 23 30
C: 1 1 3 3 5 7 8
A: 12 30
B: 9 11 23 30
C: 1 1 3 3 5 7 8 9
A: 12 30
B: 11 23 30
C: 1 1 3 3 5 7 8 9 9
A: 12 30
B: 23 30
C: 1 1 3 3 5 7 8 9 9 11
A: 30
B: 23 30
C: 1 1 3 3 5 7 8 9 9 11 12
A: 30
B: 30
C: 1 1 3 3 5 7 8 9 9 11 12 23
5
n final, vectorul C va conine elementele vectorilor A i B ordonate:
C: 1 1 3 3 5 7 8 9 9 11 12 23 30 30
1 5 8 3 4 2 1 0
Descompunere 1 5 8 3 4 2 1 0
1 5 8 3 4 2 1 0
Caz particular 1 5 8 3 4 2 1 0
1 5 3 8 2 4 0 1
Interclasare 1 3 5 8 0 1 2 4
0 1 1 2 3 4 5 8
n cazul n care vectorul dat are un singur element, recursivitatea este aplicabil dar
sortarea nu este posibil deoarece submulimea este deja ordonat.
Ordinul de complexitate al algoritmului MergeSort este O(n log2 n) unde n este
dimensiunea vectorului initial supus sortarii.
Algoritmul de sortare prin interclasare urmeaz ndeaproape paradigma divide et
impera.
Divide: mparte irul de n elemente care urmeaz a fi sortat n dou subiruri de cte n/2
6
elemente.
Stapaneste: Sorteaz recursiv cele dou subiruri utiliznd sortarea prin interclasare.
Combina: Interclaseaz cele dou subiruri sortate pentru a produce rezultatul final.
Pseudocod
mergesort(real v[p..u])
if (p<u)
m [(p+u)/2]
mergesort(v, p, m)
mergesort(v, m+1, u)
interclasare (v, p, u)
endif
Sirurile v[p], v[p+1], v[m] respectiv v[m+1], v[m+2], v[u] sunt sortate (in urma
apelurilor recursive) si li se poate aplica algoritmul de interclasare. Functia interclasare
construieste un al treilea sir in vectorul a, iar sirul astfel obtinut este copiat in final inapoi in
vectorul v intre pozitile p si u.
interclasare(real v[p..u])
m [(p+u)/2]
ip
j m+1
k0
while (i<=m and j<= u) do
k k+1
if (v[i]<=v[j])
a[k] v[i]
i i+1
else
a[k] v[j]
7
j j+1
endif
endwhile
while (i<=m) do
k k+1
a[k] v[i]
i i+1
endwhile
while (j<=u) do
k k+1
a[k] v[j]
j j+1
endwhile
for i 1, k do
v[i+p-1] a[i]
endif
8
Capitolul 3
Sortarea prin inserie, este un algoritm eficient pentru sortarea unui numr mic de
obiecte. Sortarea prin inserie funcioneaz n acelai fel n care muli oameni sorteaz un
pachet de cri de joc. Se ncepe cu pachetul aezat pe mas cu faa n jos i cu mna stng
goal. Apoi, lum cte o carte de pe mas i o inserm n poziia corect n mna stng.
Pentru a gsi poziia corect pentru o carte dat, o comparm cu fiecare dintre crile aflate
deja n mna stng, de la dreapta la stnga (sau de la stnga la dreapta), aa cum este ilustrat
n Figura 2.1.
Figura 2.1.
Exemplul 1
9
cnd este gsita poziia corecta pentru A[j] (liniile 36), moment n care acesta este inserat pe
poziia corect n vectorul ordonat (linia 7).
Pseudocod
A1 A2 A3 A4 A5 A6
5 2 4 6 1 3
2 5 4 6 1 3
2 4 5 6 1 3
2 4 5 6 1 3
1 2 4 5 6 3
1 2 3 4 5 6
Figura 2.2.
10
menionat de John Mauchly, n 1946, n prima discuie public referitoare la sortarea pe
calculator.
Exemplul 2
11
Pseudocod
12
Capitolul 4
Unul din cel mai des utilizai algoritmi este Quicksort. Metoda quikcsort face parte
din clasa metodelor avansate de sortare i s-a dovedit c este cea mai rapid metod de sortare
bazat pe interschimbarea elementelor. Metoda este popular deoarece este uor de
implementat, adaptabil, servete multor tipuri de probleme i consuma mai puine resurse
dect orice alt metod in majoritatea situaiilor. Cea mai apreciat caracteristic a
algoritmului quicksort este c folosete doar o stiv auxiliar mic ce necesit aproximativ n
logn operaii n medie pentru a sorta n elemente.
Se alege la ntamplare un element din vectorul ce urmeaz a fi sortat. Metoda
quicksort separa celelalte n-1 elemente n 2 vectori: un vector de stnga care conine
elementele care ar aprea naintea elementului ales n vectorul deja sortat, i un vector de
dreapta care conine elementele care ar aprea dup elementul ales. Stnga i dreapta
reprezint poziia fa de elementul ales unde se aeaz elemnetele vectorului ordonat.
Prin aceast grupare reies 2 avantaje: primul, elementul pivor ajunge exact pe poziia
pe care va fi n vectorul sortat. Al doi-lea avantaj va fi c nici un element nu va trece dintr-o
parte n alta. n acest mod, se pot sorta fiecare din cei doi vectori independent. Aceast
metod d posibilitatea de a dezvolta un algoritm de sortare recursiv, deoarece se poate fololi
partiionarea ca modalitate de sortare pentru fiecare subvector. Algoritmul poate fi uor
verificat pentru c fiecare element ajunge n cele din urm n poziia potrivit.
Metoda Divide et Impera este utilizat n sortarea rapid.
Ideea algoritmului:
1. Se alege o valoare pivot. Se ia valoarea elementului din mijloc ca valoare pivot, dar
poate fi oricare alt valoare, care este n intervalul valorilor sortate, chiar dac nu este
prezent n tablou.
13
2. Partiionare. Se rearanjeaz elementele n aa fel nct, toate elementele care sunt
mai mari dect pivotul merg n partea dreapt a tabloului. Valorile egale cu pivotul pot sta n
orice parte a tabloului. n plus, tabloul poate fi mprit n pri care nu au aceeai dimensiune
(nu sunt egale).
3. Se sorteaz amndou prile.se aplic recursiv algoritmul de sortare rapid n
partea stng i n partea dreapt.
V= {1 13 7 28 10 16 3 10 2}
14
15
16
17
Pseudocod
18
Capitolul 5
Heapsort
Heapsort este un algoritm de sortare care combin calitile sortrii prin inserie cu
cele ale sortrii prin interclasare. A fost inventat de Williams 1964 i mai poart denumirea
de sortare prin metoda ansamblelor. Prin heapsort se ordoneaz elementele n spaiul alocat
vectorului. La un moment dat doar un numr constant de elemente ale vectorului sunt
pstrate n afara spaiului alocat vectorului de intrare (sortare pe loc).
Timpul de execuie al agoritmului heapsort este O(n lgn). Introduce structura de date
heap util i n tratarea eficient a unei cozi de prioritate. Se folosete i n legtur cu
alocarea dinamic, respectiv n tratarea memoriei bazate pe "colectarea reziduurilor" (garbage
collected storage). Dei este un algoritm excelent, o implementare bun a algoritmului de
sortare rapid se poate dovedi de multe ori mai eficient.
Un heap este un vector care poate fi vizualizat sub forma unui arbore binar aproape
complet. Fiecare nod al arborelui corespunde unui element al vectorului care conine valorile
ataate nodurilor. Arborele este plin, exceptnd eventual nivelul inferior, care este plin de la
stnga la dreapta doar pn la un anumit loc.
Gsirea minimului din tablou, operaie ce are loc la fiecare pas, se bazeaz pe aducerea
tabloului la forma de ansamblu. Un ansamblu este un ir Ai (i = 1 N) care ndeplinete
urmatoarele condiii pentru fiecare i:
Ai A2i
Ai A2i+1
Evident, pentru valori ale lui i mai mari decat N/2 nu se pune problema ndeplinirii
conditiilor de mai sus.
Orice tablou poate fi transformat usor intr-un arbore binar :
19
Dac tabloul era ansamblu, se observa c arborele binar obinut ndeplinete
urmtoarea condiie: fiecare nod are cheia mai mare sau egala cu a tatlui su.
Astfel, A2 si A3 sunt mai mari sau egale cu A1, A4 si A5 sunt mai mari sau egale cu A2,
s. a. m. d. Dar A1 este rdcina arborelui binar, ceea ce nseamn c A1 trebuie s fie
elementul minim al tabloului
Deci, ntr-un ansamblu, elementul minim se afl ntotdeauna pe prima poziie.
n cadrul algoritmului HeapSort, dac la fiecare pas aducem tabloul pe care lucrm la
forma unui ansamblu nseamn c am localizat n acelai timp i minimul din tablou.
Aducerea unui tablou la forma de ansamblu se face urmrind situaii cum este cea
descris mai jos. Dac nu este ndeplinit una din condiiile: Ai A2i si Ai A2i+1 , atunci se
va interschimba Ai cu minimul dintre A2i si A2i+1 . Elementele astfel interschimbate vor
ndeplini condiia de ansamblu.
Pentru o eficien ct mai mare, urmrirea acestui gen de situaii trebuie fcut de la
dreapta la stnga, n caz contrar fiind nevoie de reveniri repetate chiar i dup ce o situaie de
neconcordan a fost rezolvat.
Se consider un vector de n numere ntregi A[0], A[1],., A[n], ce reprezint datele
de intrare. Se cere ordonarea elementelor vectorului folosind metoda de sortare rapid,
Quicksort.
Se va explica exemplifica algoritmul sortarii rapide pentru urmtorul vector:
20
Problema se pune numai
pentru noduri neterminale.
21
9 a ajuns pe un nivel terminal (nu mai are
fii) deci nu mai continum n jos. n acest moment, tabloul a ajuns la forma de ansamblu,
fiecare nod avnd cheia mai mic sau egal dect cheile fiilor si. Cel mai mic element al
tabloului a ajuns pe post de rdcin. Interschimbm rdcina cu ultimul element al tabloului,
adica 1 cu 8.
22
Nodurile neterminale considerate
sunt,in ordine: 5, 3, 2 si 8.
Pseudocod
{fiu=k, parinte=(fiu-1)/2
ct timp fiu>0 i v[parinte]<x
{v[fiu]=v[parinte]
fiu=parinte
parinte=(fiu-1)/2
v[fiu]=x
}
}
23
intoarce aux
}
24
Capitolul 6
Shellsort
25
Se reface tabloul, sortnd elementele din 7 in 7.
Acestea sunt:
1. 12, 1, 15, 24, 9
2. 8, 6, 7, 18, 21
3. 3, 2, 13, 23, 19
4. 4, 17, 14, 30.
Algoritmul se repet pn cnd elementele sunt la distana H[4] = 1. In acest caz se
aplic sortarea prin inserie. Rezultatul final este:
Pseudocod
26
a[j + salt[iter]] := a[j];
j := j salt[iter];
sfarsit cat timp;
a[j + salt[iter]] := aux;
sfarsit pentru;
sfarsit pentru;
27
Capitolul 7
Sortarea prin selecie
Sortarea prin selecia minimului (sau maximului) este metoda de ordonare prin
selectarea unui element i plasarea lui pe poziia sa final direct n tabloul A. De exemplu, n
caz de ordonare cresctoare, pornind de la primul element se caut valoarea minim din
tablou. Aceasta se aeaz pe prima poziie printr-o interschimbare ntre elementul de pe prima
poziie i elementul minim de pe poziia k. Apoi, se reia algoritmul, pornind de la a doua
poziie i se caut minimul ntre elementele a2, ..., an. Acesta se interschimb cu al doilea
dac este cazul. Procedeul se continu pn la ultimul element.
28
Pseudocod
29
Capitolul 8
Bubble Sort
Prin metoda de sortare prin metoda buleleor se parcurge vectorul i se compar fiecare
element cu succesorul su. Dac nu sunt n ordine cele dou elemente, acestea se interschimb
ntre ele. La prima parcurgere elementul de valoare maxim se deplaseaz ctre ultima
poziie. La a doua parcurgere, elementul imediat urmtor ca valoare dup elementul maxim se
deplaseaz ctre penultima poziie. Vectorul se parcurge de mai multe ori, pn cnd la o
parcurgere complet nu se mai execut nici o interschimbare ntre elemente, nici o deplasare.
Considerm un vector v cu 10 elemente: 128, 77, 907, 407, 372, 478, 553, 348, 237,
878.
30
878 907 907 907 907 907 907 907
237 878 878 878 878 878 878 878
348 237 553 553 553 553 553 553
553 348 237 478 478 478 478 478
478 553 348 237 407 407 407 407
372 478 478 348 237 372 472 472
407 372 407 407 348 237 348 348
907 407 372 372 372 348 237 237
77 128 128 128 128 128 128 128
128 77 77 77 77 77 77 77
Trecerea 1
Trecerea 2
Trecerea 3
Trecerea 4
Trecerea 5
Trecerea 6
Pseudocod
Subalgoritm Metoda_bulelor(v,n)
repet
ok = adevrat
pentru i=1,n-1 execut
dac v[i]>v[i+1] atunci
ok = fals
aux = v[i]
v[i]= v[i+1]
v[i+1]=aux
sfrit dac
sfrit pentru
pn cnd ok
sfrit subalgoritm
31
Capitolul 9
Arbori binari de cutare
Arborii sunt struturi de date dinamice i omogene. Exist un nod numit rdcin sau
printe. Un arbore reprezint o mulime de noduri ntre care exist relaia printe fiu. Nodul
care nu are printe se numete rdcin. Nodurile care nu au nici un fiu se numesc frunze.
Un tip particular de arbori l reprezint arborii binari. Acetia se disting prin faptul c
orice nod are cel mult 2 fii. De cele mai multe ori se stabilete o ordine ntre fii unui nod: fiu
stng respectiv fiu drept.
Un arbore n care operaiile de cutare sunt foarte rapide se numete arbore de cutare.
Arborii de cutare sunt folosii pentru a memora o mulime finit de chei alese dintr-o
mulime total ordonat de chei. Fiecare nod din arborii de cutare conine una sau mai multe
chei i toate cheile din arbore sunt unice. Nu se memoreaz chei duplicate. Diferena dintre
arborii oarecare i cei de cutare este c n arborii de cutare, cheile nu sunt memorate n
noduri arbitrare din arbori. n schimb, exist un criteriu de ordine care determin unde trebuie
memorat o cheie ce se afl n relaie cu alte chei din arbore.
Arborii binari de cutare sunt arbori n care nodurile sunt memorate ordonat n funcie
de o cheie. Toate nodurile din arbore au n subarborele stng noduri care au chei mai mici i
in subarborele drept chei mai mari.
Exist mai multe posibiliti de parcurgere a arborilor binari. Cele mai cunoscute si
utilizate sunt cele cunoscute prin denumirile de parcurgere in inordine, preordine si
32
postordine. n toate cele trei tipuri de parcurgere, pentru fiecare vrf se viziteaza nti
subarborele stng i apoi cel drept. La parcurgerea n preordine, vizitarea vrfului se face
nainte de vizitarea subarborelui stng. La parcurgerea n inordine, vizitarea vrfului se face
ntre vizitarea subarborelui stang i a celui drept. La parcurgerea n postordine, vizitarea
vrfului se face dup vizitarea subarborelui drept.
1
2 8
4 5
6
7
33
9.1. Parcurgerea n inordine (SRD)
Pentru parcurgere se pleac din rdcin i se coboar spre stnga ct timp este
posibil; cnd nu mai putem cobor spre stnga, dar putem cobor spre dreapta, mergem un pas
spre dreapta i relum procedeul. Cnd nu mai putem merge nici spre dreapta, urcm n arbore
pn ajungem la un vrf venind din descendentul su stng, vrf care are un descdendent
drept; trecem n acest descedent si repetam procedeul.
void par_srd(BTREE t)
{ if(t!=NULL)
{ par_srd(t->left);
visit(t);
par_srd(t->right);
}
}
Se consider funcia visit() care examineaz informaia dintr-un nod i are prototipul
prototipul: void visit(BTREE);
void par_rsd(BTREE t)
{ if(t!=NULL)
{ visit(t);
par_rsd(t->left);
par_rsd(t->right);
}
}
34
9.3. Parcurgerea n postordine (SDR)
void par_sdr(BTREE t)
{ if(t!=NULL)
{ par_sdr(t->left);
par_sdr(t->right);
visit(t);
}
}
35
Capitolul 10
Arbori Rou Negru
Un arbore rou-negru este un arbore binar care conine cte o informaie n plus pentru
fiecare nod aceasta fiind culoarea care poate fi rosu sau negru. Arborii rosu-negrii ne asigur
c nu exist o cale cu lungimea de dou ori mai mare dect orice alt cale, deci aceti arbori
sunt aproximativ echilibrai.
Fiecare nod al arborelui rosu-negru conine urmatoarele cmpuri:
- culoarea (CuI)
- cheia (KEY)
- legatura din stnga (LS)
- legatura din dreapta (LD)
- parintele (P)
Un arbore binar de cautare este arbore rosu-negru dac ndeplinete urmtoarele
proprieti:
1.Fiecare nod este rou sau negru.
2.Fiecare frunz Nil (Null) este neagr.
3.Dac un nod este rou, atunci ambii descendeni sunt negri.
4.Pe orice cale ntre un nod i o frunz descendent se afl acelai numr de noduri
negre.
5.Nodul rdcin este ntotdeauna negru.
36
Figura 10.1 Arbori
Rou - Negru
37