Cod sursa(job #1199439)

Utilizator hrazvanHarsan Razvan hrazvan Data 19 iunie 2014 14:30:49
Problema Radix Sort Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#define MAXN 10000000
#define BYTE 8
int v[ MAXN + 1 ], next[ MAXN + 1 ], prim;

void rsort( int n ){
    long long shift;
    int mask = ( 1 << BYTE ) - 1, x, last, i;
    int ult[ 1 << BYTE ], pr[ 1 << BYTE ];
    for ( shift = 0; shift < 4 * BYTE; shift += BYTE ){
        for ( i = 0; i < ( 1 << BYTE ); i++ ){
            ult[ i ] = 0;
            pr[ i ] = 0;
        }
        for( i = prim; i <= n; i = next[ i ] ){
            x = ( v[ i ] >> shift ) & mask;
            if ( ult[ x ] == 0 )    pr[ x ] = i;
            next[ ult[ x ] ] = i;
            ult[ x ] = i;

        }
        last = 0;
        prim = -1;
        for ( i = 0; i < ( 1 << BYTE ); i++ ){
            if ( pr[ i ] != 0 ){
                if ( prim == -1 )   prim = pr[ i ];
                next[ last ] = pr[ i ];
                last = ult[ i ];
            }
        }
        next[ last ] = n + 1;
    }
    return ;
}

int main()
{
    FILE *in = fopen ( "radixsort.in", "r" );
    int n, a, b, c;
    fscanf ( in, "%d%d%d%d", &n, &a, &b, &c );
    fclose ( in );
    int i;
    v[ 1 ] = b;
    prim = 1;
    for ( i = 2; i <= n; i++ ){
        v[ i ] = ( ( long long )v[ i - 1 ] * ( long long )a + ( long long )b ) % c;
        next[ i ] = i + 1;
    }
    next[ 1 ] = 2;
    rsort( n );
    FILE *out = fopen ( "radixsort.out", "w" );
    int poz = prim;
    for ( i = 1; i <= n; i++ ){
        if ( i % 10 == 1 ){
            fprintf ( out, "%d ", v[ poz ] );
        }
        poz = next[ poz ];
    }
    fclose ( out );
    return 0;
}