Cod sursa(job #2220461)

Utilizator ksanyi2000Kalman Sandor ksanyi2000 Data 11 iulie 2018 18:48:57
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
using namespace std;


void general(int n, long long A, int B, int C, int v[])
{
    v[0] = B;
    for(int i=1; i<n; i++)
        v[i] = (A*v[i-1]+B)%C;
}


void lada_rendezes(int forras[], int cel[], int n, int poz)
{
    int elemszam[1<<8] = {0};

    for(int i=0; i<n; i++)
        elemszam[(forras[i]>>(poz*8))&255]++;

    int osszegek[1<<8];
    osszegek[0] = 0;
    for(int i=1; i<256; i++)
        osszegek[i] = osszegek[i-1]+elemszam[i-1];

    int h[1<<8] = {0};
    for(int i=0; i<n; i++)
    {
        int csoport = (forras[i]>>(poz*8))&255;
        cel[osszegek[csoport]+h[csoport]] = forras[i];
        h[csoport]++;
    }
}


void rendez(int n, int v[])
{
    int *tomb = new int[n];

    lada_rendezes(v, tomb, n, 0);
    lada_rendezes(tomb, v, n, 1);
    lada_rendezes(v, tomb, n, 2);
    lada_rendezes(tomb, v, n, 3);

    delete []tomb;
}


void kiir(int n, int v[], ofstream &out)
{
    for(int i=0; i<n; i+=10)
        out << v[i] << ' ';
    out << '\n';
}


int main()
{
    ifstream in("radixsort.in");
    ofstream out("radixsort.out");

    int n, A, B, C;
    in >> n;
    int *v = new int[n];
    in >> A >> B >> C;

    general(n,A,B,C,v);

    rendez(n,v);

    kiir(n,v,out);


    return 0;
}