Cod sursa(job #2607856)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 30 aprilie 2020 12:07:39
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>
#include <string.h>

using namespace std;

void Radix(vector<uint32_t>& v, int iter)
{
    if (iter <= 0)
        return;

    if (!v.size())
        return;

    vector<uint32_t> vec[16];

    for (int i = 0; i < v.size(); i++)
    {
        int index = (v[i] >> (iter - 1) * 4) & 15;
        vec[index].push_back(v[i]);
    }

    for (int i = 0; i < 16; i++)
        Radix(vec[i], iter - 1);

    int index = 0;
    for (int i = 0; i < 16; i++)
        for (int j = 0; j < vec[i].size(); j++)
            v[index++] = vec[i][j];
}

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

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

    vector<uint32_t> v;
    v.resize(n);
    v[0] = b;
    for (int i = 1; i < n; i++)
        v[i] = (a * v[i - 1] + b) % c;
    //Radix(v, 8);

    for (int i = 0; i < 4; i++)
    {
        vector<uint32_t> cnt[256];

        for (int j = 0; j < v.size(); j++)
        {
            int index = (v[j] >> (8 * i)) & 255;
            cnt[index].push_back(v[j]);
        }

        int index = 0;
        for (int j = 0; j < 256; j++)
            for (int k = 0; k < cnt[j].size(); k++)
                v[index++] = cnt[j][k];
    }

    ofstream fout("radixsort.out");
    
    for (int i = 0; i < n; i += 10)
        fout << v[i] << " ";
    
    fout.close();

    return 0;
}