Cod sursa(job #1891954)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 24 februarie 2017 14:46:56
Problema Radix Sort Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.68 kb
#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;
}