Pagini recente » Cod sursa (job #49128) | Cod sursa (job #722861) | Cod sursa (job #1041870) | Cod sursa (job #1323377) | Cod sursa (job #1891954)
#include <stdio.h>
#include <string.h>
#define nmax 10000000
#define BITS 8
#define mask ( ( 1<<BITS ) - 1 )
#define selection_limit 64
int v[nmax];
void myssort( int start, int stop ){
int i, j, aux, pozmin;
for( i=start; i<stop; i++ ){
pozmin = i;
for( j=i+1; j<stop; j++ ){
if( v[j] < v[pozmin] ){
pozmin = j;
}
}
aux = v[i];
v[i] = v[pozmin];
v[pozmin] = aux;
}
}
void mybsort( int start, int stop, int poz_bit ){
int i, nr, bucket_nr, aux, beginning;
int ptr[ 1<<BITS ], bucket[ 1<<BITS ];
memset( bucket, 0, sizeof(bucket) );
for( i=start; i<stop; i++ )
bucket[ (v[i]>>poz_bit)&mask ]++; ///frecv
ptr[0] = start;///adaugam pozitiile pentru subsecventele anterioare
bucket[0] += start;
for( i=1; i<(1<<BITS); i++ ){///contruim intervalele
ptr[i] = bucket[i-1];
bucket[i] += bucket[i-1];
}
for( i=0; i<(1<<BITS); i++ ){///parcurgem bucket-urile
while( ptr[i]!=bucket[i] ){ ///cat timp elem cu acelasi bucket nu sunt unl langa altul
nr = v[ ptr[i] ];
bucket_nr = ( nr>>poz_bit ) & mask;
while( bucket_nr!=i ){ ///cat timp nu am gasit elem cu acel bucket
aux = v[ ptr[ bucket_nr ] ];
v[ ptr[bucket_nr]++ ] = nr; ///punem elem curent in bucketul sau
nr = aux;
bucket_nr = ( nr>>poz_bit ) & mask;
}
v[ ptr[bucket_nr]++ ] = nr; ///punem elementul cu bucketul corect pe poz corecta in vector
}
}
///dupa ce am ordonat bucket-ul curent, ordonam fiecare sub-bucket
if( poz_bit>0 ){ ///daca exista un subbucket
for( i=0; i<(1<<BITS); i++ ){
beginning = ( i==0 ) ? start : bucket[i-1]; ///dimensiunea subbucket-ului
if( bucket[i]-beginning>selection_limit ) ///pt nr mai mici, e mai rapid select sort
mybsort( beginning, bucket[i], poz_bit-BITS );
else if( bucket[i]-beginning>1 ) ///daca am 0 sau 1 elemente in bucket, inseamna ca e deja sortat
myssort( beginning, bucket[i] );
}
}
}
int main()
{
int n, a, b, c, i;
FILE *fin, *fout;
fin = fopen( "radixsort.in", "r" );
fscanf( fin, "%d%d%d%d", &n, &a, &b, &c );
fclose( fin );
v[0] = b % c;
for( i=1; i<n; i++ )
v[i] = ( ( 1LL * a * v[i-1] ) % c + b ) % c;
mybsort( 0, n, 32-BITS );
fout = fopen( "radixsort.out", "w" );
for( i=0; i<n; i+=10 )
fprintf( fout, "%d ", v[i] );
fputc( '\n', fout );
fclose( fout );
return 0;
}