Cod sursa(job #1199405)

Utilizator hrazvanHarsan Razvan hrazvan Data 19 iunie 2014 13:39:49
Problema Radix Sort Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#define MAXN 10000000
#define BYTE 8
int v[ MAXN + 1 ], prev[ 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 ];
    for ( shift = 0; shift < 4 * BYTE; shift += BYTE ){
        for ( i = 0; i < ( 1 << BYTE ); i++ )   ult[ i ] = 0;
        for( i = prim; i <= n; i = next[ i ] ){
            x = ( v[ i ] >> shift ) & mask;
            next[ ult[ x ] ] = i;
            prev[ i ] = ult[ x ];
            ult[ x ] = i;
        }
        last = 0;
        prim = -1;
        for ( i = 0; i < ( 1 << BYTE ); i++ ){
            if ( ult[ i ] != 0 ){
                x = ult[ i ];
                while ( prev[ x ] > 0 ){
                    x = prev[ x ];
                }
                if ( prim == -1 )   prim = x;
                next[ last ] = x;
                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;
        prev[ i ] = i - 1;
        next[ i ] = i + 1;
    }
    prev[ 1 ] = 0;
    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;
}