Sunteți pe pagina 1din 41

Ministerul Educaiei, Cercetrii, Tineretului i Sportului

Universitatea Ovidius din Constana


Facultatea de Matematic i Informatic
Specializarea Matematic - Informatic

LUCRARE DE LICEN

Coordonator tiinific: Student:


Conf. dr. Pelican Elena Rusea Mdlina - Ionela

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

Coordonator tiinific: Student:


Conf. dr. Pelican Elena Rusea Mdlina - Ionela

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

Lucrarea de fa prezint metodele de sortare i cutare, avnd ca scop uurina


nelegerii acestora. Acest lucru a fost realizat prin descrierea metodelor, prezentarea
algoritmului n pseudocod pe un exemplu dat precum i prin ataarea (n anex) a codurilor,
scrise n C++, corespunztoare fiecrui algoritm.

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 2 este descris metoda de sortare prin interclasare, Mergesort, ce mparte


irul curent n 2 subiruri care urmeaz a fi sortate n urma unui proces recursiv.

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.

Capitolul 4 prezint metoda sortrii prin partiionare. Quicksort se bazeaz pe metoda


interschimbrii, ns interschimbarea se face pe distane mai mari. Algoritmul se realizeaz cu
ajutorul unui pivor ce mparte sirul n dou subiruri asupra crora se aplic recusiv metoda
rapid de sortare pn ce irul este total ordonat.

Capitolul 5 propune spre discuie metoda de sortare Heapsort. Ideea algoritmului


const n construirea unui ansamblu cu structur arborescent ce conine elementele unui ir
ce urmeaz a fi sortate.

n capitolul 6 este prezentat algoritmul de sortare Shellsort, algoritm care se mai


numete i algoritm de sortare cu micorarea incrementului. Ideea de baz o constituie
rearanjarea elementelor din tabel n asa fel nct, lund fiecare a h-ul element (ncepnd de
oriunde), s obtinem o tabel sortat. Astfel spunem c tabela este h-sortat. O tabel , h-
sortat este format din h subtabele sortate independent, intercalate. Folosind astfel o
procedur pentru fiecare secvent a valorii lui h care se termin n 1, va produce o tabel
sortat.

Capitolul 7 este dedicat metodei de Sortare prin selecie. Algoritmul const n


cautarea valorii minime din irul de valori de sortat. Minimul se interschimb cu elementul de
pe prima poziie, algoritmul aplicndu-se recursiv pentru irul rmas nesortat.

Capitolul 8 cuprinde metoda algoritmului de sortare Bubble Sort. Ideea de baz a


sortrii Bubble sort const n parcurgerea vectorului i compararea fiecrui element cu
succesorul su. Dac nu sunt n ordine cele dou elemente, acestea se interschimb ntre ele,
pn cnd vectorul este ordonat.

Capitolele 9 si 10 cuprind metode de cutare, i anume: Arboi binari de cutare i


Arbori Rosu Negru.

2
Capitolul 2
Sortarea prin interclasare (Mergesort)

Acest algoritm de sortare implementeaz tehnica divide et impera. Pasul de divide se


face prin mparirea irului curent n dou subsiruri care urmeaz a fi sortate n urma
procesului recursiv. Subirurile ordonate sunt apoi interclasate (impera). Complexitatea sortri
prin interclasare este O(nlog n).
Interclasarea a dou iruri ordonate este un proces prin care se construiete un al
treilea sir sortat cu elementele celor doua siruri initiale. Interclasarea a dou iruri de numere
ordonate crescator presupune parcurgerea simultan a celor dou i compararea elementelor
curente; cel mai mic din cele doua se copiaz ntr-un al treilea ir la sfrit i se elimin din
irul iniial (n practic nu este obligatoriu sa fie eliminat, urmtorul devine curent). Cnd
elementele unui ir au fost epuizate, elementele rmase n cellalt sunt copiate n noul ir la
sfrit.
Se consider un vector de n numere ntregi V[0], V[1],., V[n], ce reprezint datele
de intrare. Se cere ordonarea elementelor vectorului folosind metoda de sortare prin
interclasare.

Paii algoritmului sunt:

1. Pasul 1: Se mparte n mod repetat vectorul n 2 subvectori de acelai tip.


2. Pasul 2: Se sorteaz elementele subvectorilor ultimi.
3. Pasul 3: Se interclaseaz subvectorii obinui anterior.

Se va explica algoritmul de sortare prin interclasare pentru 2 cazuri:


1. Interclasarea a dou iruri ordonate;
2. Interclasarea pentru un ir de elemente.

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

Se continu algoritmul succesiv i se obin irurile:

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

Exemplul 2: Interclasarea pentru un ir de elemente

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

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

Figura 2.2 ilustreaz modul de funcionare a acestui algoritm pentru A = (5, 2, 4, 6, 1,


3). Indicele j corespunde crii care urmeaz a fi inserat n mna stnga. Elementele A[1..j
- 1] corespund mulimii de cri din mna, deja sortate, iar elementele A[j + 1..n] corespund
pachetului de cri aflate nc pe mas. Indicele se deplaseaz de la stnga la dreapta n
interiorul vectorului. La fiecare iteraie, elementul A[j] este ales din vector (linia 2). Apoi,
plecnd de la poziia j - 1, elementele sunt, succesiv, deplasate o poziie spre dreapta pn

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

void inserare_directa(int n, int (&v)[20])


{ int j,element,i;
for(j=2;j<=n;j++)
{ i=j-1;
element=v[j];
while(i>=1 && v[i]>element)
{v[i+1]=v[i];
i=i-1;}
v[i+1]=element;} }

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.

Algoritmul de sortare prin inserare poate fi mbuntit pornind de la observaia c


subtabloul din stnga, n care urmeaz s se efectueze inserarea, este deja ordonat. n acest
caz, cutarea locului de inserare se poate face mai rapid utiliznd metoda cutrii binare.
Aceasta const n njumtirea repetat a intervalului vizat pn la gsirea locului cutat.
Metoda de inserie se numete inserare binar. De exemplu, la inserarea celui de-al 32-lea
element putem ncepe prin a compara r[32] cu r[16]; dac valoare este mai mic, o comparm
cu r[8], iar dac este mai mare o comparm cu r[24] etc., deci locul n care trebuie inserat
r[32] va fi cunoscut dup efectuarea a doar ase comparaii. Metoda inserie binar a fost

10
menionat de John Mauchly, n 1946, n prima discuie public referitoare la sortarea pe
calculator.

Exemplul 2

r[1] r[2] r[3] r[4] r[5] r[6]


Fie urmtorul vector: 219 128 243 98 491 151

Elementul ce urmeaz a fi inserat i


Ordinea elementelor dup inserare
comparaiile acestuia cu elementele tabloului
i=1 r[1] = 219
i=2, mijloc=1, element=128;
se compar element cu v[1] r[1] = 128, r[2] = 219
se insereaz element pe poziia 1
i=3, mijloc=1, element=243;
se compar element cu v[1]
mijloc=2 r[1] = 128, r[2] = 219, r[3]=243
se compar element cu v[2]
se insereaz element pe poziia 3
i=4, mijloc=2, element=98;
se compar element cu v[2]
mijloc=1; r[1] = 98, r[2] = 128, r[3]=219, r[4]=243
se compar element cu v[1]
se insereaz element pe poziia 1
i=5, mijloc=2, element=491
se compar element cu v[2]
mijloc=3;
r[1] = 98, r[2] = 128, r[3]=219, r[4]=243,
se compar element cu v[3]
r[5]=491
mijloc=4
se compar element cu v[4]
se insereaz element pe poziia 5
i=6, mijloc=3, element=151
se compar element cu v[3]
mijloc=1
r[1] = 98, r[2] = 128, r[3]=151, r[4]=219,
se compar element cu v[1]
r[5]=243, r[6]=491
mijloc=2
se compar element cu v[2]
se insereaz element pe poziia 3

11
Pseudocod

Subalgoritm inserare_binara (n,v)


pentru i =2,n executa
element = v[i]
inceput = 1
sfarsit = i-1
ct timp(inceput<=sfarsit) execut
mijloc = (inceput+sfarsit)/2
dac (element < v[mijloc])
sfarsit=mijloc-1
altfel
inceput=mijloc+1
sfrit ct timp
pentru j=i,inceput+1,-1 execut
v[j] = v[j-1]
sfrit pentru
v[inceput]=element
sfrit pentru
sfrit subalgoritm

12
Capitolul 4

Sortarea rapida (Quicksort)

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.

Se consider un vector de n numere ntregi V[0], V[1],., V[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:

V= {1 13 7 28 10 16 3 10 2}

14
15
16
17
Pseudocod

QuickSort (inceput, sfarsit)


i =inceput
j = sfarsit
temp = a[(i+j)/2]
repeta
cat timp a[i] < temp executa
i=i+1
sfarsit cat timp
cat timp a[j] > temp executa
j=j-1
sfarsit cat timp
daca i < j atunci
schimba a[i] cu a[j]
sfarsit daca
daca i <= j atunci
j = j-1
i = i+1
sfarsit daca
pana cand I <= j
daca inceput < j atunci
QuickSort (inceput, j)
sfarsit daca
daca I < ultimul atunci
QuickSort (I, ultimul)
sfarsit daca

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.

Localizm cel mai de jos


nod neterminal, i n caz c sunt
mai multe astfel de noduri, l
considerm pe cel mai din
dreapta acesta este 8. Cum 8
are fiii 7 i 2 i este mai mare dect ambii, se va interschimba cu cel mai mic dintre ei,
adic cu 2.

nainte de a trece la noul


nod neterminal, verificm ca ultimul
nod interschimbat (5) sa
ndeplineasc condiia referitoare la
fiii sai (7 si 8) se obser c o
ndeplinete. Noul nod neterminal
este 9. Acesta nu ndeplinete
condiiile, fiind mai mare si dect 2 i dect 1, ca atare, 9 va fi interschimbat cu cel mai mic,
deci cu 1.
S-ar putea ca ultimul nod
interschimbat (9) nc s nu
ndeplineasc condiiile
referitoare la fiii si, n noua sa
locaie. 9 fiind mai mare i dect
4 si dect 3, se va interschimba
cu 3 (cel mai mic). Astfel de
interschimbri repetate vor avea
loc pn cnd 9 ajunge pe un nivel pe care fiii si sunt mai mari sau egali cu el (sau pe
un nivel unde nu mai are fii).

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.

Elementul minim (1) se


elimia i se adaug la un tablou
auxiliar, iniial vid, care va conine
la final elementele sortate:

22
Nodurile neterminale considerate
sunt,in ordine: 5, 3, 2 si 8.

Datorit pasului anterior,


nodurile 5, 3 si 2 ndeplinesc condiiile
referitoare la fiii lor (paii anteriori au
uurat sarcina pasului curent). Nodul 8
nu ndeplinete condiiile, deci va fi
interschimbat cu 2. Repetnd algoritmul de transformare a tabloului n ansamblu i eliminnd
dup fiecare pas elementul minim obinut (rdcina arborelui), vom obine n tabloul auxiliar
elementele ordonate.

Pseudocod

HeapSort (int v[ ], int n)


{pentru i de la 1 la n-1
Heap_Insert (v, i, v[i])
pentru i de la n-1 la 1
v[i]=Heap_Max_Delete(v, i+1)

Heap_Insert (int v[ ], int k, int x)

{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
}
}

Heap_Max_Delete (int v[ ], int k)


{
aux=v[0]
Constr_Heap (v, 0, k-1)

23
intoarce aux
}

Constr_Heap (int v[ ], int p, int m)


{
parinte=p, aux=v[m]
cat timp adevarat, executa
fiu=Max_Fiu (v, parinte, m-1)
daca fiu<0 sau v[fiu]<aux
break
v[parinte]=v[fiu], parinte=fiu
v[parinte]=aux }

Max_Fiu (int v[ ], int p, int m)


{
s=2p+1
daca s>m intoarce -1
d=2p+2
daca d>m intoarce s
daca v[s]>v[d] intoarce s
altfel
intoarce d
}

24
Capitolul 6
Shellsort

ShellSort este un algoritm de sortare performant, bazat pe sortarea prin inserie


(InsertSort), fiind supranumit i insetie cu diminuarea incrementului.
Algoritmul Shellsort propune alegerea n prealabil a unui tablou H, numit tablou de
incrementi :
Tabloul de incremeni trebuie s ndeplineasc condiiile:
1. H are M elemente (0 M-1) cu M>1
2. H[M-1] = 1 (ultimul element trebuie s fie 1)
3. H[i] > H[i+1] pentru i = 0 .. M-2 (H trebuie s fie un tablou strict
descresctor).
De exemplu, H = [7, 4, 3, 2, 1].
Algoritmul va face M treceri asupra tabloului A, unde M este lungimea tabloului de
incremeni. Dup fiecare pas i, elementele aflate n tabloul A la distana H[i] unul de altul vor
fi sortate. Sortarea acestor elemente se va face folosind algoritmul de sortare prin inserie.
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 Shellsort.
Se va exemplifica algoritmul sortarii rapide pentru urmtorul vector:

La pasul 0, se va sorta folosind sortarea prin inserie elementele aflate la distana


H[0]=7 unul de cellalt. Acestea sunt:
1. 17, 12, 23
2. 8, 30, 15
3. 3, 9, 7
4. s. a. m. d.
Ele ocup celule colorate din reprezentarea de mai jos.

25
Se reface tabloul, sortnd elementele din 7 in 7.

n continuare se sorteaz elementele aflate la distana H[1]=4 unul de celalalt.


4 4 4

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

int salt[5] := {1, 4, 10, 23, 57};


int numar_iteratii := 5;
pentru iter := numar_iteratii-1 pana la 0
pentru i := salt pana la N-1
aux := a[i];
j := i salt[iter];
cat timp (j>=0) si (a[j] > aux)

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.

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 prin selecie.
Paii algoritmului sunt:

se determin minimul dintre valorile reinute, ncepnd cu prima poziie


minimul este trecut n prima poziie , prin interschimbarea coninuturilor dintre
componenta de indice 1 i componenta care l memoreaz;
se determin minimul dintre valorile reinute, ncepnd cu a doua poziie;
minimul este trecut n poziia doi, prin interschimbarea coninuturilor dintre
componenta de indice 2 i componenta care l memoreaz.

Se va exemplifica algoritmul sortrii prin selecie pentru urmtorul vector:


Fie tabloul A = (5, 0, 8, 7, 3).
Pas Tabloul A Element minim Poziia minimului Noul tablou A
i=1 (5, 0, 8, 7, 3) 0 2 (0, 5, 8, 7, 3)
i=2 (0, 5, 8, 7, 3) 3 5 (0, 3, 8, 7, 5)
i=3 (0, 3, 8, 7, 5) 5 5 (0, 3, 5, 7, 8)
i=4 (0, 3, 5, 7, 8) 7 4

28
Pseudocod

pentru i=1,n-1 execut


pentru j=i+1,n execut
dac a[i] > a[j] atunci
aux = a[i]
a[i] = a[j]
a[j] = aux
sfrit dac
sfrit pentru
sfrit pentru

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.

Algoritmul const n parcurgerea tabloului v de mai multe ori, pn cnd devine


ordonat. La fiecare pas se compar dou elemente consecutive vi i vi+1 . Dac vi > vi+1 , (i
= 1, 2, ..., n - 1), atunci cele dou valori se interschimb ntre ele. Controlul aciunii repetitive
este dat de variabila boolean ok, care la fiecare reluare a algoritmului primete valoarea
iniial adevrat, i care se schimb n fals dac s-a efectuat o interschimbare de dou
elemente consecutive. n momentul n care tabloul v s-a parcurs fr s se mai efectueze nici o
schimbare, ok rmne cu valoarea iniial adevrat i algoritmul se termin, deoarece tabloul
este ordonat. Interschimbarea a dou elemente se realizeaz prin intermediul variabilei
auxiliare aux care are acelai tip ca i elementele tabloului.

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 prin
BubbleSort.

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.

Parcurgerea unui arbore const na atinge pe rnd varfurile arborelui i de a pune n


eviden pentru fiecare numai una din atingerile sale (spunem c vizitm varful respectiv, prin
aceasta nelegnd efectuarea unor prelucrri ale informaiilor atasate varfului).

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

Pentru acest exemplu, parcurgerea n preordine furnizeaz vrfurile n ordinea:


1 2 3 4 5 6 7 8.
Parcurgerea n inordine furnizeaz vrfurile n ordinea:
4 3 6 5 7 2 1 8.
Parcurgerea n postordine furnizeaz vrfurile n ordinea:
4 6 7 5 3 2 8 1.

Se d un arbore binar de cutare cu n noduri, implementat folosind un vector A[n].


Poziia care nu corespunde nici unui nod este considerat drept nul. Se presupune c oricare
dou chei (numere naturale nenule) sunt distincte.

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);

9.2. Parcurgerea n preordine (RSD)

n preordine (RSD - rdcin, stnga, dreapta), adic se viziteaz rdcina, subarborele


stng si apoi subarborele drept; cei doi subarbori vor fi tratai ca arbori n procesul de
parcurgere, aplicnd acelasi algoritm - RSD.

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)

n postordine (SDR - stnga, dreapta, rdcin), adic se parcurge subarborele drept,


cel stng si apoi se viziteaz rdcina; cei doi subarbori vor fi tratai ca arbori n procesul de
parcurgere, aplicnd acelasi algoritm - 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