Cod sursa(job #1718461)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 17 iunie 2016 22:14:59
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 10000001

using namespace std;

vector<unsigned int> buckets[256];
unsigned int v[NMAX];

int main()
{
    FILE *fin, *fout;
    unsigned int N, A, B, C;
    unsigned int i, j, k;
    unsigned char X;
    vector<unsigned int>::iterator it;

    fin = fopen("radixsort.in", "r");
    fout = fopen("radixsort.out", "w");
    fscanf(fin, "%u %u %u %u", &N, &A, &B, &C);

    v[1] = B;
    for(i=2; i<=N; i++)
        v[i] = (1LL * A * v[i-1] + B) % C;

    for(i=0; i<4; i++)
    {
        for(j=1; j<=N; j++)
        {
            X = (v[j] >> (8*i)) & 0xFF;
            buckets[X].push_back(v[j]);
        }

        k = 1;
        for(j=0; j<256; j++)
        {
            if(!buckets[j].empty())
            {
                sort(buckets[j].begin(), buckets[j].end());
                for(it=buckets[j].begin(); it!=buckets[j].end(); it++)
                    v[k++] = *it;

                buckets[j].clear();
            }

        }

    }

    for(i=1; i<=N; i+=10)
        fprintf(fout, "%u ", v[i]);
    putc('\n', fout);


    fclose(fin);
    fclose(fout);
    return 0;
}