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 Concluzii
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;
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;
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;
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);
}
Quicksort – cod 2
void SortareQuicksort(int *tab, int n){
SortareQuicksortRecursiv(0,n,tab,n);}
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
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
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] ;
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;
}}
}
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
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
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;
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);
}}
Radixsort – cod 2void Radixsort(int *tab, int n){
RadixsortRecursiv(0,n-1,sizeof(int)*8-2,tab,n);}
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;}
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
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
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
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
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