Sunteți pe pagina 1din 25

VIII.

Tehnici de sortare
1. Principiile sortrii
2. Sortare prin interschimbare
3. Sortare prin inserie
4. Sortare prin partiionare
5. Concluzii
Principiile sortrii
Sortarea const n ordonarea unei mulimi de elemente, cu
scopul de a facilita cutarea ulterioar a unui element dat.
Elementele sortate pot fi, la modul general, structuri de
urmtorul tip:
typedef struct {
int key;
... /*alte cmpuri*/
} element;
Principiile sortrii
Fiind dat irul de elemente de tipul definit mai sus, n
forma iniial:
a
1
, a
2
, ..., a
n
prin sortare se nelege permutarea elementelor ntr-o
anumit ordine:
a
k1
, a
k2
, ..., a
kn
astfel nct irul cheilor s devin monoton cresctor:
a
k1
.key a
k2
.key ..., a
kn
.key
Cmpul cheie (key) a fost considerat, pentru
simplificare, de tip ntreg n realitate el putnd fi de orice
tip scalar.
Principiile sortrii
Elementele sortate pot fi componente ale mai multor feluri
de structuri de date, att statice (tablouri, fiiere) ct i
dinamice (liste). Problemele prezentate n continuare sunt
tipice pentru sortarea tablourilor.
n cazul sortrii tablourilor sunt posibile dou variante de
abordare principial diferite:
sortarea tabloului iniial (in-place);
construirea unui nou tablou, ca rezultat al sortrii
tabloului iniial. Aceast variant necesit un surplus de
memorie i, din aceast cauz, nu se utilizeaz dect
atunci cnd n problem este necesar pstrarea tabloului
iniial.
Principiile sortrii
Eficien i complexitate
Eficiena unui algoritm de sortare se apreciaz n funcie de timpul
de execuie pe care l necesit. Indicatorii specifici pentru
aprecierea cantitativ a eficienei algoritmului sunt:
numrul comparrilor de chei (notat C);
numrul de mutri de elemente (notat M).
Ambii indicatori depind de numrul total n, al elementelor sortate.
Din punct de vedere al complexitii lor, tehnicile de sortare pot fi:
simple sau directe, caz n care att C ct i M sunt
aproximativ proporionali (de acelai ordin de mrime cu) n
2
:
(n
2
)
avansate, caz n care C i M sunt de ordinul de mrime al lui
nlog
2
n: (nlog
2
n)
Principiile sortrii
Eficien i complexitate
Ctigul de eficien este ilustrat de raportul n
2
/(nlog
2
n).
Exemple :
n=64 log
2
n=6 n
2
/(n log
2
n) = 10
n=1024 log
2
n=10 n
2
/(n log
2
n) = 100
n=32768 log
2
n=15 n
2
/(n log
2
n) = 2000
Dei ameliorarea este substanial, tehnicile de sortare directe
prezint n continuare interes din urmtoarele motive:
sunt foarte potrivite pentru explicitarea principiilor sortrii;
programele rezultate sunt scurte i uor de neles;
sunt eficiente pentru valori mici ale lui n.
Principiile sortrii
Tehnici i metode
Se pot identifica mai multe categorii de tehnici de
sortare, i anume:
Sortarea prin inserie
Sortarea prin selecie
Sortarea prin interschimbare
Sortarea prin partiionare
...
Sortare prin interschimbare
Principiu
Tehnica sortrii prin interschimbare este reprezentat printr-o
clas de metode bazate pe urmtorul principiu : se compar
elementele alturate i se interschimb ntre ele, dac ordinea
nu este cea dorit, pn cnd sunt sortate toate elementele. n
acest scop se realizeaz treceri repetate prin tablou iar n
urma interschimbrilor, elementele cu valori mici ale cheii se
deplaseaz spre stnga concomitent cu deplasarea spre
dreapta a celor cu valori mari.
n continuare vor fi prezentate trei variante de algoritmi:
Brute Force Bubblesort
Bubblesort
Shakersort
Sortare prin interschimbare
Brute Force Bubblesort
void BruteForceBubblesort(element *tablou, int len){
int i,j;
element aux;
for(i=1;i<len;++i)
for(j=len-1;j>=i;--j)
if(tablou[ j-1 ].key>tablou[ j ].key)
{
aux=tablou[ j-1 ];
tablou[ j-1 ]=tablou[ j ];
tablou[ j ]=aux;
}
}
Sortare prin interschimbare
Brute Force exemplu
Se observ un dezavantaj major al metodei : n cazul n
care elementele se ordoneaz mai repede, ultimele treceri
prin tablou rmn fr efect. Exemplul cel mai defavorabil
este irul gata sortat. O prezumtiv mbuntire s-ar putea
obine dac se marcheaz faptul c a avut loc, sau nu, vreo
interschimbare pe parcursul unei trecerii.
iniial 4 7 2 1
i=1 1 2 4 7
i=2 1 4 2 7
i=3 1 4 2 7
Sortare prin interschimbare
Bubblesort
void Bubblesort(element *tablou, int len){
int i, modify; element aux;
do {
modify=0;
for( i=1;i< len ;++i)
if(tablou[ i-1 ].key > tablou[ i ].key){
aux=tablou[ i-1 ];
tablou[ i-1 ]=tablou[ i ];
tablou[ i ]=aux;
modify=1;
}
} while(modify);
}
Sortare prin interschimbare
Bubblesort exemplu
Obs.: Schimbndu-se i sensul de parcurgere a tabloului, de
data aceasta elementele cu valori mari ale cheii sunt cele care
ajung rapid pe pozitia lor.
iniial 4 7 2 1
2 1 4 7
2 4 1 7
1 4 2 7
1 4 2 7
Sortare prin interschimbare
Bubblesort analiz
Dezavantaje la metoda bubblesort :
Numrul de treceri prin ir a crescut cu unu (ultima
trecere se efectueaz fr a face vre-o interschimbare).
De fiecare dat se parcurge irul dintr-un capt n
cellalt (ceea ce se evit n cazul variantei brute force).
O nou mbuntire se poate obine marcnd, nu faptul c au
avut sau nu loc schimbri n ir, ci indicele k al ultimului
element deplasat. Este evident faptul c toate elementele
situate dincolo de acest indice sunt ordonate iar urmtoarea
trecere se poate ncheia aici.
O a doua mbuntire se poate obine prin alternarea
sensurilor de parcurgere ale trecerilor succesive.
Sortare prin interschimbare
Shakersort
void Shakersort(element *tablou, int len){
int i, k, left, right; element aux;
left=1; right=len-1; k=len-1;
do {
for( i=right; i>=left; --i)
if(tablou[ i-1 ].key>tablou[ i ].key){
Swap( i, i-1 ); k=i-1; }
left=k+1;
for( i=left; i<=right; ++i)
if(tablou[ i-1 ].key>tablou[ i ].key){
Swap( i, i-1 ); k=i; }
right=k-1;
} while( left<=right );
}
Sortare prin interschimbare
Shakersort exemplu
Bubblesort: C=(n
2
-n)/2 M
med
=3*(n
2
-n)/4
Shakersort: C
med
=(n
2
-n*(k+ln(n)))/2 M - nemodificat
iniial 4 7 2 1
1 2 4 7
1 4 2 7
left=1 right=3 k=3
k=0 left=1 right=3
k=2 left=1 right=1
Sortare prin inserie
Inserie simpl
Parcurgem irul de la stnga la dreapta i inserm fiecare
element direct la locul su, printre cele situate la stnga sa.
void Insertion (element *tablou, int len){
int i, j; element aux;
for(i=1; i<len; ++i)
{
aux=tablou[ i ];
for( j=i-1; j>=0 && aux.key<tablou[ j ].key; j--)
tablou[ j+1 ]=tablou[ j ];
tablou[ j+1 ]=aux;
}
}
Sortare prin inserie
Inserie simpl exemplu
Performane:
C
med
=(n
2
-n-4)/4
M
med
=3*(n
2
+9* n - 10)/4
iniial 2 4 7
i=1 2 4 2 7
i=2 7 4 2 7
i=3 1 2 1 4
1
1
1
7
aux
Sortare prin inserie
Inserie binar
Algoritmul de sortare prin inserie poate fi
mbuntit pornind de la observaia c subsecvena 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 corespunztoare se numete
inserie binar.
Sortare prin inserie
Inserie binar
void Binary_Insertion (element *tablou, int len){
int i, j, left, right, m; element aux;
for(i=1;i<len;i++) {
aux=tablou[i];
left=0; right=i-1;
while(left<=right){
m=(left+right) / 2;
if(tablou[m].key>aux.key)
right=m-1;
else
left=m+1; }
for(j=i-1; j>=left; j--)
tablou[ j+1 ]=tablou[ j] ;
tablou[ left ]=aux;
} }
Sortare prin partiionare
Principiu
Performane(Inserie Binar):
C=n*(log
2
(n/e)+log
2
e M - nemodificat
Principalul dezavantaj al metodelor prezentate pn acum
const n aceea c deplasarea unui element n ir se face, n
majoritatea cazurilor, cu o singur poziie rezultnd un mare
numr de deplasri. Acest dezavantaj a condus la ideea
construirii unor algoritmi n care micrile se realizeaz pe
distane mai mari.
Folosind deplasri pe orice distan, un tablou poate fi
rearanjat i apoi spart n dou, astfel nct sortnd cele dou
jumti (nu neaprat de aceeai lungime) s obinem o sortare
a ntregului tablou.
Sortare prin partiionare
Quicksort prezentare general
Algoritmul Quicksort este de tip Divide & Conquer i se
bazeaz pe spargerea tabloului de sortat n dou pri, care se
sorteaz independent, dar cu aceeai procedur.
void Quicksort(int left, right){
int i;
if (right > left ) {
i=Partition(left,right);
Quicksort(left, i-1);
Quicksort(i+1, right);
}
}
Sortare prin partiionare
Quicksort descriere
Se ia un element x, oarecare, al tabloului de sortat a
1
, a
2
, ..., a
n
, de
exemplu la mijloc. Se parcurge tabloul de la stnga pn se gsete
primul element a
i
>= >= >= >=x. Apoi se parcurge tabloul de la dreapta pn
se gsete primul element a
j
<= <= <= <=x. Se schimb ntre ele elementele a
i
cu a
j
. Se continu parcurgerea tabloului de la stnga i de la
dreapta, din punctele n care s-a ajuns anterior, pn se gsesc alte
dou elemente care se schimb ntre ele .a.m.d. Procesul se
termin cnd cele dou parcurgeri se ntlnesc undeva n
interiorul tabloului (i> >> >j). Efectul obinut este acela c tabloul iniial
este partiionat ntr-o parte stng cu elemente <= <= <= <=x i ntr-o parte
dreapt cu elemente >= >= >= >=x. n continuare se aplic acelai procedeu
celor dou pri rezultate, apoi celor patru pri ale acestora .a.m.d.
pn cnd fiecare partiie se reduce la un singur element.
Se observ c procedeul este n mod natural recursiv.
Sortare prin partiionare
Quicksort implementare
void Quicksort(element *tablou, int left, int right){
int i, j; element x, aux;
i=left; j=right; x=tablou[(left+right)/2];
do {
while (tablou[ i ].key<x.key && i<right) i++;
while (x.key<tablou[ j ].key && j>left) j--;
if( i<=j ) {
aux=tablou[ i ]; tablou[ i ]=tablou[ j ]; tablou[ j ]=aux;
i++; j--;
}
} while(i<=j);
if (left<j) Quicksort(tablou, left, j);
if (i<right) Quicksort(tablou, i, right);
}
Concluzii
Aplicaii ale tehnicile de sortare
cutri eficiente
teste de unicitate
eliminarea dublurilor
selectarea dup diverse criterii
determinarea frecvenelor de apariie
refacerea ordinii iniiale
reuniunea i intersecia mulimilor
...
Concluzii
Ce tehnici aplicm i cnd anume ?
Ce algoritmi de sortare folosim n practic ?
pn la 1000 de elemente sunt foarte bune i
metodele directe
pn la 5000 de elemente se recomand Shellsort
(dup Sedgewick)
Quicksort este performant dac datele sunt
aleatoare

S-ar putea să vă placă și

  • Continutul Cursului CTI
    Continutul Cursului CTI
    Document9 pagini
    Continutul Cursului CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 6-CTI
    Cap. 6-CTI
    Document92 pagini
    Cap. 6-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 9-CTI
    Cap. 9-CTI
    Document34 pagini
    Cap. 9-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 7-CTI
    Cap. 7-CTI
    Document46 pagini
    Cap. 7-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 4-CTI
    Cap. 4-CTI
    Document28 pagini
    Cap. 4-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 5-CTI
    Cap. 5-CTI
    Document66 pagini
    Cap. 5-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 3-CTI
    Cap. 3-CTI
    Document51 pagini
    Cap. 3-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 2-CTI
    Cap. 2-CTI
    Document62 pagini
    Cap. 2-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 9-CTI
    Cap. 9-CTI
    Document34 pagini
    Cap. 9-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 1-CTI
    Cap. 1-CTI
    Document39 pagini
    Cap. 1-CTI
    Catalin Manole
    Încă nu există evaluări
  • Cap. 7-CTI
    Cap. 7-CTI
    Document46 pagini
    Cap. 7-CTI
    Catalin Manole
    Încă nu există evaluări