Sunteți pe pagina 1din 25

VIII.

Tehnici de sortare

1. 2. 3. 4. 5.

Principiile sortrii Sortare prin interschimbare Sortare prin inserie Sortare prin partiionare 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: a1, a2, ..., an prin sortare se nelege permutarea elementelor ntr-o anumit ordine: ak1, ak2, ..., akn astfel nct irul cheilor s devin monoton cresctor: ak1.key ak2.key ..., akn.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) n2: (n2) avansate, caz n care C i M sunt de ordinul de mrime al lui nlog2n: (nlog2n)

Principiile sortrii
Eficien i complexitate
Ctigul de eficien este ilustrat de raportul n2/(nlog2n). Exemple : n=64 log2n=6 n2/(nlog2n) = 10 n=1024 log2n=10 n2/(nlog2n) = 100 n=32768 log2n=15 n2/(nlog2n) = 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
iniial 4 2 7 1 i=1 i=2 1 4 2 7 1 2 4 7

i=3 1 2 4 7 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.

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
iniial 4 2 7 1 2 4 1 7 2 1 4 7 1 2 4 7 1 2 4 7 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.

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

iniial 4 2 7 1 1 4 2 7 1 2 4 7

left=1 k=0 k=2

right=3 k=3 left=1 right=3 left=1 right=1

Bubblesort: C=(n2-n)/2 Mmed=3*(n2-n)/4 Shakersort: Cmed =(n2-n*(k+ln(n)))/2 M - nemodificat

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
aux iniial i=1 i=2 i=3 4 2 7 1 2 2 4 7 1 7 2 4 7 1 1 1 2 4 7

Performane: Cmed=(n2-n-4)/4 Mmed=3*(n2 +9* n - 10)/4

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*(log2(n/e)+log2e 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 a1, a2, ..., an, de exemplu la mijloc. Se parcurge tabloul de la stnga pn se gsete primul element ai>=x. Apoi se parcurge tabloul de la dreapta pn se gsete primul element aj<=x. Se schimb ntre ele elementele ai cu aj. 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

  • Cap. 9-CTI
    Cap. 9-CTI
    Document34 pagini
    Cap. 9-CTI
    Catalin Manole
    Încă nu există evaluări
  • Continutul Cursului CTI
    Continutul Cursului CTI
    Document9 pagini
    Continutul Cursului 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. 6-CTI
    Cap. 6-CTI
    Document92 pagini
    Cap. 6-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. 1-CTI
    Cap. 1-CTI
    Document39 pagini
    Cap. 1-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. 7-CTI
    Cap. 7-CTI
    Document46 pagini
    Cap. 7-CTI
    Catalin Manole
    Încă nu există evaluări