Cod sursa(job #1193839)

Utilizator mihai995mihai995 mihai995 Data 1 iunie 2014 23:35:03
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <cstring>
using namespace std;

const int N = 1 + 1e7, B = 8;

unsigned int v[N], aux[N];

template<class Type>
void radix(Type v[], int n){
    int cnt[ (1 << B) + 1 ], mask = (1 << B) - 1;
    for (int shr = 0 ; shr < 8 * sizeof(Type) ; shr += B){
        memset(cnt, 0 ,sizeof(cnt));
        cnt[0] = 1;
        for (int i = 1 ; i <= n ; i++)
            cnt[ 1 + ( ( v[i] >> shr ) & mask ) ]++;
        for (int i = 1 ; i < (1 << B) ; i++)
            cnt[i] += cnt[i - 1];
        for (int i = 1 ; i <= n ; i++)
            aux[ cnt[ ( v[i] >> shr ) & mask ]++ ] = v[i];
        memcpy(v, aux, sizeof(aux));
    }
}

void gen(int n, long long a, long long b, int c){
    v[0] = 0;
    for (int i = 1 ; i <= n ; i++)
        v[i] = (a * v[i - 1] + b) % c;
}

int main(){
    unsigned int n, a, b, c;

    ifstream in("radixsort.in");
    in >> n >> a >> b >> c;
    in.close();

    gen(n, a, b, c);
    radix(v, n);

    ofstream out("radixsort.out");
    for (int i = 1 ; i <= n ; i += 10)
        out << v[i] << ' ';
    out << '\n';

    out.close();

    return 0;
}