Cod sursa(job #2676245)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 23 noiembrie 2020 20:11:35
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <string.h>

#define MAX_N 10000000
#define MAX_BITS 32
#define BITS_PER_STEP 8
const int BASE = (1 << BITS_PER_STEP);
const int MASK = BASE - 1;

int v1[MAX_N], v2[MAX_N];
int freq[BASE], ind[BASE];

void sort(int v[], int aux[], int n, int bits) {
    if ( bits == MAX_BITS )
        return;

    memset(freq, 0, sizeof(freq));

    int i;
    for ( i = 0; i < n; i++ )
        ++freq[v[i] >> bits & MASK];

    ind[0] = 0;
    for ( i = 1; i < BASE; i++ )
        ind[i] = ind[i - 1] + freq[i - 1];

    for ( i = 0; i < n; ++i )
        aux[ind[v[i] >> bits & MASK]++] = v[i];

    sort ( aux, v, n, bits + BITS_PER_STEP );
}

int main() {
    FILE *fin, *fout;
    int n, a, b, c, i;

    fin = fopen( "radixsort.in", "r" );
    fscanf ( fin, "%d%d%d%d", &n, &a, &b, &c );
    v1[0] = b;
    for ( i = 1; i < n; i++ )
        v1[i] = ( (long long) v1[i - 1] * a + b ) % c;
    fclose ( fin );

    sort ( v1, v2, n, 0 );

    fout = fopen( "radixsort.out", "w" );
    for ( i = 0; i < n; i += 10 )
        fprintf ( fout, "%d ", v1[i] );
    fclose ( fout );

    return 0;
}