Sunteți pe pagina 1din 4

Metode de sortare

In cazul unui vector sortat elementul cu indice i este succesorul celor cu indici de la 0 la i-1 si
predecesorul celor cu indici de la i+1 la n-1.
Sortarea prin selectie
Sa consideram un vector in care elementele cu indici de la 0 la i-1 sunt deja sortate. Pentru a continua
procesul de sortare, dintre elementele ramase (cu indici de la i pana la n-1) trebuie gasit predecesorul
tuturor celorlalte (cu indice ipg) si adus in pozitia i.
i-1

...

ipg

.. ..

elemente sortate

n-1

.. ..

elemente nesortate

Sortarea prin selectie a unui vector de intregi:


i
0
1
2
3
4
5
6

10
3
3
3
3
3
3

5
5
5
5
5
5
5

Vectorul prelucrat
6 12 3
7
6 12 10 7
6 12 10 7
6 12 10 7
6
7 10 12
6
7
9 12
6
7
9 10

12 9
12 9
12 9
12 9
12 9
12 10
12 12

ipg
4
1
2
5
7
7
6

In acest exemplu elementul selectat dintr-o secventa este marcat prin hasurare, iar locul in care trebuie
plasat acesta este marcat prin chenar dublu.

Algoritmul SelSort (X, N)


pentru i de la 0 la n-2
{ determina ipg = indice predecesor global (ipg [i, n-1] )
daca ipg > i atunci
inverseaza x[i] cu x[ipg], folosind zona tampon aux;
}

Sortarea prin insertie


In cazul sortarii prin insertie se considera ca vectorul este sortat pana la o anumita pozitie si se
incearca inserarea urmatorului element pe pozitia potrivita. Daca vectorul ar avea un singur element, el
ar fi deja sortat; in cazul unui vector cu 2 elemente, care nu respecta relatia de ordine, este suficienta
inversarea acestora. Sa presupunem ca vectorul are mai mult de 2 elemente si ca am sortat deja, in
ordine crescatoare, primele i-1 elemente. Pentru a extinde sortarea la i elemente este necesara
deplasarea la dreapta, cu o pozitie, a tuturor succesorilor elementului i, urmata de inserarea sa in
pozitia corespunzatoare. Aceasta presupune compararea elementului i cu cele deja sortate, situate la
stanga sa. Daca aceasta operatie se efectueaza de la dreapta spre stanga, atunci ea poate fi
combinata cu cea de deplasare.
j j+1
i-1 i

...
predecesori aux

... ...

...

succesori aux se
deplaseaza la dreapta

Sortarea prin insertie a unui vector de intregi:

aux

i
1
2
3
4
5
6
7
8

Vectorul prelucrat
10 5
6 12 3
7 12 9
5 10 6 12 3
7 12 9
5
6 10 12 3
7 12 9
5
6 10 12 3
7 12 9
3
5
6 10 12 7 12 9
3
5
6
7 10 12 12 9
3
5
6
7 10 12 12 9
3
5
6
7
9 10 12 12

In acest exemplu elementul care trebuie inserat intr-o secventa deja sortata este marcat cu un chenar
dublu, iar succesorii sai, care trebuie deplasati spre dreapta, sunt marcati prin hasurare.

Algoritmul InserSort (x, n)


pentru i de la 1 la n-1
{ copiaza x[i] in aux;
deplaseaza la dreapta succesorii lui aux
inlocuieste ultimul element deplasat cu cel din aux
}

Sortarea prin metoda bulelor imbunatatita


Aceasta metoda se bazeaza pe faptul ca intr-un vector sortat toate perechile de elemente consecutive
trebuie sa respecte relatia de ordine. Daca aceasta relatie nu este respectata, atunci elementele
trebuie interschimbate. Verificarea perechilor trebuie reluata pana cand nu mai este necesara nici o
interschimbare, dar fiecare noua etapa de verificare se poate opri la perechea din fata celei care a
necesitat ultima interschimbare (u_inv), deoarece, evident, perechile urmatoare respecta relatia de
ordine.
Sortarea prin metoda bulelor imbunatatita a unui vector de intregi:
lim
6

1
0

ip
0
1
2
3
4
5
0
1
2
3
0
1
2
0

Vectorul prelucrat
10 5
6 12 3
7
5 10 6 12 3
7
5
6 10 12 3
7
5
6 10 12 3
7
5
6 10 3 12 7
5
6 10 3
7 12
5
6 10 3
7 12
5
6 10 3
7 12
5
6 10 3
7 12
5
6
3 10 7 12
5
6
3
7 10 12
5
6
3
7 10 12
5
3
6
7 10 12
5
3
6
7 10 12
3
5
6
7 10 12

12
12
12
12
12
12
12
12
12
12
12
12
12
12
12

u_inv
0
1
1
3
4
4
0
0
2
3
0
1
1
0

Fiecare pereche analizata este evidentiata printr-un chenar dublu, hasurat in cazul in care elementele
trebuie interschimbate. Limita fiecarei etape de verificare este marcata prin linie dubla mai groasa.

Algoritmul B_Sort (x, n)


lim = n - 1;

cat timp lim > 0


{ u_inv = 0
pentru fiecare pereche ip, cu ip de la 0 la lim-1
daca ordine incorecta atunci { interschimba elementele din perechea ip;
u_inv = ip;
}
lim = u_inv;
}

MergeSort - sortare prin divizare si interclasare (fuziune)


In cazul acestei metode vectorul de sortat este divizat in subvectori, prin injumatatiri succesive, cat timp
lungimea acestora este > 2. Evident, un subvector de lungime 1 este sortat, iar un subvector de
lungime 2 necesita cel mult interschimbarea celor doua valori. Subvectorii sortati sunt interclasati
succesiv, in ordinea inversa divizarii, obtinand in final vectorul sortat. Deoarece interclasarea necesita
un vector auxiliar, sortarea propriu-zisa va fi precedata de alocarea unei zone tampon de aceeasi
lungime cu vectorul de sortat.
Pentru a evita copierea rezultatului unei interclasari din vectorul auxiliar in cel de sortat si a reduce
astfel numarul de operatii, vectorul initial si cel auxiliar pot fi utilizati alternativ ca sursa si, respectiv,
rezultat al operatiei de interclasare. De asemenea, daca analizam exemplele urmatoare:
subvectori sursa

rezultat interclasare

| 15, 18 | 3, 8, 11 |

=>

| 3, 8, 11, 15, 18 |

| 2, 5 | 5, 14 |

=>

| 2, 5, 5, 14 |

observam ca un subvector poate fi predecesorul celuilalt (ultimul element dintr-un subvector este
predecesorul primului element din celalalt). In astfel de cazuri interclasarea poate fi inlocuita prin
copierea celor doi subvectori, in ordine inversa (primul exemplu) sau pastrand ordinea existenta (al
doilea exemplu).

Sortarea prin divizare si fuziune a unui vector de intregi:


10 5
10 5
10 5
5 10
5

Vectorul prelucrat
6 12 3 7 12
6 12

sursa, rez
9

6 12
10 12

3
3

7
7

12

3
9

12 9
9 12
7 9 12
10 12 12

Faza

w , v
v , w

lung. subvectori
8
4

divizare
divizare

w , v

tratare pereche

w
v
v
w

v
w
w
v

2
4
4
2

tratare pereche
fuziune
divizare
tratare pereche

w , v

tratare pereche

v , w
w , v

4
8

fuziune
fuziune

,
,
,
,

In acest exemplu frontierele subvectorilor sunt marcate cu linie dubla, iar subvectorii care implica
interschimbare sau interclasare sunt evidentiati prin hasurare.

Algoritmul MergeSort ( v, n)
creeaza w - copia vectorului v
MSort (n, w, v) - sorteaza cele n elemente din w, obtinand rezultatul in v
elibereaza spatiul ocupat de w

Algoritmul MSort ( n, sursa, rez)


daca n este
> 2:
{ determina dimensiunea primului subvector (j = n / 2)
apeleaza MSort pentru sortarea primelor j elemente din rez in sursa;
apeleaza MSort pentru sortarea ultimelor n-j elemente din rez in sursa;
daca primul subvector sursa il precede pe al doilea atunci
copiaza cele n elemente din sursa in rez
altfel
daca al doilea subvector sursa il precede pe primul atunci
copiaza in rez al doilea subvector, urmat de primul
altfel
interclaseaza cei doi subvectori sursa in rez
}
= 2: daca ordine incorecta atunci
copiaza in rez in ordine inversa (al doilea, primul)
Algoritmul MSort este un algoritm recursiv.
Algoritmul iterativ MSortI, prezentat in cele ce urmeaza, foloseste interclasarea pentru a construi
subvectori sortati de lungimi din ce in ce mai mari.

Algoritmul MSortI ( v, n)
aloca spatiu pentru w;
sorteaza perechile de elemente din v in w;
k = 2; sursa = w si rez = v;
cat timp k < n
interclaseaza in rez perechi de subvectori sursa de lungime k (ultimul subvector
poate avea lungime < k);
inverseaza sursa si rez;
dubleaza k;
daca rez este w atunci copiaza w in v
elibereaza spatiul ocupat de w

Sortarea cu MSortI a unui vector de intregi:


Vectorul prelucrat
12 3 7 15 12
12 3 7 12 15

6
6

3
3

v , w
w , v

2 x 5 , 1

5
3
3

10 12 3 7 12 15 3 4 9
6 7 10 12 12 15 3 4 9
4 5 6 7 9 10 12 12 15

v , w
w , v
v , w

4 x 2 , 3
8 x 1 , 3
11

4
9

Lungimi subvectori

10 5
5 10
6
5
3

9
4

sursa, rez