22
Tehnici de sortare avansată a tablourilor Structuri de date şi algoritmi -laborator- s.l. dr. ing. Ciprian-Bogdan Chirilă Universitatea Politehnica Timişoara 2014

Tehnici de sortare avansat ă a tablourilor

  • Upload
    arama

  • View
    35

  • Download
    4

Embed Size (px)

DESCRIPTION

Tehnici de sortare avansat ă a tablourilor. Structuri de date şi algoritmi - laborator - s.l . dr. ing. Ciprian-Bogdan Chiril ă Universitatea Politehnica Timi ş oara 2014. Cuprins. Sortarea prin partiţionare - Quicksort BinSort RadixSort Conclu z ii. - PowerPoint PPT Presentation

Citation preview

Page 1: Tehnici de sortare avansat ă  a tablourilor

Tehnici de sortare avansată a tablourilor

Structuri de date şi algoritmi-laborator-

s.l. dr. ing. Ciprian-Bogdan ChirilăUniversitatea Politehnica Timişoara

2014

Page 2: Tehnici de sortare avansat ă  a tablourilor

Cuprins

Sortarea prin partiţionare - Quicksort

BinSort RadixSort Concluzii

Page 3: Tehnici de sortare avansat ă  a tablourilor

Sortarea prin partiţionare - Quicksort

Se alege un element oarecare al tabloului tab[k] pe care-l notăm cu x;

Se parcurge tabloul de la stânga la dreapta până se găseşte primul element tab[i]>x;

Se parcurge tabloul de la dreapta la stânga până se găseşte primul element tab[j]<x;

Page 4: Tehnici de sortare avansat ă  a tablourilor

Sortarea prin partiţionare - Quicksort

Cele două elemente astfel găsite tab[i] şi tab[j] se interschimbă;

Se reia parcurgerea tabloului din punctele rămase până se găsesc alte două elemente care trebuiesc interschimbate;

Procesul se încheie când cele două parcurgeri se întâlnesc;

Page 5: Tehnici de sortare avansat ă  a tablourilor

Sortarea prin partiţionare - Quicksort

Tabloul este compus din două partiţii: Cea din stânga cu elemente mai mici

decât x; Cea din dreapta cu elemente mai

mari decât x; Procedura se aplică pe cele două

partiţii obţinute până se ajunge la partiţie de un singur element;

Page 6: Tehnici de sortare avansat ă  a tablourilor

Quicksort – cod 1void SortareQuicksortRecursiv(int s, int d, int *tab, int n){

int i,j,x,w;i=s; j=d;x=tab[(s+d)/2];do{

while(tab[i]<x) i++;while(tab[j]>x) j--;if(i<=j){

w=tab[i];tab[i]=tab[j];tab[j]=w;i++;j--;

}}while(i<=j);if(s<j)SortareQuicksortRecursiv(s,j,tab,n);if(d>i)SortareQuicksortRecursiv(i,d,tab,n);

}

Page 7: Tehnici de sortare avansat ă  a tablourilor

Quicksort – cod 2

void SortareQuicksort(int *tab, int n){

SortareQuicksortRecursiv(0,n,tab,n);}

Page 8: Tehnici de sortare avansat ă  a tablourilor

Quicksort – demo 1 0 1 2 3 4 5 6

47 78 92 50 33 21 19

47 19 92 50 33 21 78

47 19 21 50 33 92 78

47 19 21 33 50 92 78

47 19 21 33 50 92 78

19 47 21 33 50 92 78

19 47 21 33 50 92 78

19 33 21 47 50 92 78

Page 9: Tehnici de sortare avansat ă  a tablourilor

Quicksort – demo 2 0 1 2 3 4 5 6

19 33 21 47 50 92 78

19 21 33 47 50 92 78

19 21 33 47 50 92 78

19 21 33 47 50 92 78

19 21 33 47 50 78 92

19 21 33 47 50 78 92

19 21 33 47 50 78 92

Page 10: Tehnici de sortare avansat ă  a tablourilor

Binsort Este metodă de sortare care ţine cont

de valorile cheilor; Se poate aplica în cazul în care cheile

sunt valori de tip întreg cuprins în intervalul 1..N ;

Se parcurge tabloul tab verificându-se dacă elementul tab[i] are cheia j egală cu i ;

Dacă j!=i atunci se interschimbă elementele tab[i] şi tab[j] ;

Page 11: Tehnici de sortare avansat ă  a tablourilor

Binsort - codvoid Binsort(int *tab, int n){

int i,temp;for(i=0;i<n;i++){

while(tab[i]!=i){

temp=tab[i];tab[i]=tab[temp];tab[temp]=temp;

}}

}

Page 12: Tehnici de sortare avansat ă  a tablourilor

Binsort – demo 1 0 1 2 3 4 5 6 7

i=0 7 3 1 2 0 5 4 6

i=0 6 3 1 2 0 5 4 7

i=1 6 3 1 2 0 5 4 7

i=1 6 2 1 3 0 5 4 7

i=2 6 2 1 3 0 5 4 7

i=2 6 1 2 3 0 5 4 7

Page 13: Tehnici de sortare avansat ă  a tablourilor

Binsort – demo 2 0 1 2 3 4 5 6 7

i=4 6 1 2 3 0 5 4 7

i=4 0 1 2 3 6 5 4 7

i=6 0 1 2 3 6 5 4 7

i=6 0 1 2 3 4 5 6 7

Page 14: Tehnici de sortare avansat ă  a tablourilor

Radixsort Cheile de sortate sunt văzute ca numere

reprezentate într-o anumită bază (radix R=2);

Cheile cu primul bit 0 sunt trecute în faţa celor care au primul bit 1;

Se aplică acceaşi metodă pentru bitul următor, etc...;

Procesul se desfăşoară ca la metoda Quicksort;

Page 15: Tehnici de sortare avansat ă  a tablourilor

Radixsort – cod 1void RadixsortRecursiv(int s, int d, int b, int *tab, int n){

int i,j,t;if((s<d) && (b>=0)){

i=s; j=d;do{

while((Biti(tab[i],b,1)==0) && (i<j)) i++;while((Biti(tab[j],b,1)==1) && (i<j)) j--;t=tab[i];tab[i]=tab[j];tab[j]=t;

}while(i<j);

if(Biti(tab[d],b,1)==0) j++; RadixsortRecursiv(s,j-1,b-1,tab,n); RadixsortRecursiv(j,d,b-1,tab,n);

}}

Page 16: Tehnici de sortare avansat ă  a tablourilor

Radixsort – cod 2void Radixsort(int *tab, int n){

RadixsortRecursiv(0,n-1,sizeof(int)*8-2,tab,n);}

Page 17: Tehnici de sortare avansat ă  a tablourilor

Radixsort – cod 3int Biti(int x,int k,int j){

int i;int doik=1;int doij=1;

for(i=0;i<k;i++)doik=doik*2;

for(i=0;i<j;i++)doij=doij*2;

return (x/doik)%doij;}

Page 18: Tehnici de sortare avansat ă  a tablourilor

Radixsort – demo 1 7 8 2 4 1 0 9 7 3

0111 1000 0010 0100 0001 0000 1001 0111 0011

0111 1000 0010 0100 0001 0000 1001 0111 0011

7 8 2 4 1 0 9 7 3

0111 0011 0010 0100 0001 0000 1001 0111 1000

7 3 2 4 1 0 9 7 8

0111 0011 0010 0100 0001 0000 0111 1001 1000

7 3 2 4 1 0 7 9 8

Page 19: Tehnici de sortare avansat ă  a tablourilor

Radixsort – demo 2

0111 0011 0010 0100 0001 0000 0111 1001 1000

7 3 2 4 1 0 7 9 8

0000 0011 0010 0100 0001 0111 0111 1001 1000

0 3 2 4 1 7 7 9 8

0000 0011 0010 0001 0100 0111 0111 1001 1000

0 3 2 1 4 7 7 9 8

0000 0011 0010 0001 0100 0111 0111 1001 1000

0 3 2 1 4 7 7 9 8

Page 20: Tehnici de sortare avansat ă  a tablourilor

Radixsort – demo 3

0000 0011 0010 0001 0100 0111 0111 1001 1000

0 3 2 1 4 7 7 9 8

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

Page 21: Tehnici de sortare avansat ă  a tablourilor

Radixsort – demo 4

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

Page 22: Tehnici de sortare avansat ă  a tablourilor

Radixsort – demo 5

0000 0001 0010 0011 0100 0111 0111 1001 1000

0 1 2 3 4 7 7 9 8

0000 0001 0010 0011 0100 0111 0111 1000 1001

0 1 2 3 4 7 7 8 9