Cod sursa(job #1345757)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 17 februarie 2015 20:49:06
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
using namespace std;

void radixSort(int v[], int N);
void countSort(int v[], int i, int N);

int main()
{
    int N, A, B, C;
    ifstream f("radixsort.in");
    f >> N >> A >> B >> C;
    f.close();
    int i;
    int *v = new int[N + 1];
    v[1] = B;
    for (i = 2; i <= N; i++)
        v[i] = (A * v[i - 1] + B) % C;

    radixSort(v, N);

    ofstream g("radixsort.out");
    for (i = 1; i <= N; i += 10)
        g << v[i] << " ";
    g.close();

    delete [] v;
    return 0;
}

void radixSort(int v[], int N)
{
    int i;
    for (i = 0; i < 4; i++)
        countSort(v, i, N);
}

void countSort(int v[], int byteNr, int N)
{
    int filter = 255;
    int countArr[256] = {};
    int *output = new int[N + 1];
    int i;
    for (i = 1; i <= N; i++)
        countArr[(v[i] >> (8 * byteNr)) & filter]++;

    for (i = 1; i <= 255; i++)
        countArr[i] += countArr[i - 1];

    for (i = N; i >= 1; i--)
    {
        output[countArr[(v[i] >> (8 * byteNr)) & filter]] = v[i];
        countArr[(v[i] >> (8 * byteNr)) & filter]--;
    }

    for (i = 1; i <= N; i++)
        v[i] = output[i];

    delete [] output;
}