Cod sursa(job #2613790)

Utilizator Horia14Horia Banciu Horia14 Data 10 mai 2020 17:45:12
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include<fstream>
#include<iostream>
#define MAX_N 10000000
#define BITS 8
#define MASK ((1 << BITS) - 1)
#define LIMIT 64
using namespace std;

int v[MAX_N];

void selectionSort(int left, int right) {
    int k, i, j, aux;
    for(i = left; i < right; ++i) {
        k = i;
        for(j = k + 1; j < right; ++j)
            if(v[j] < v[k])
                k = j;
        aux = v[i];
        v[i] = v[k];
        v[k] = aux;
    }
}

void radixSort(int left, int right, int bits) {
    int Begin[1 << BITS], End[1 << BITS];
    for(int i = 0; i < (1 << BITS); ++i)
        End[i] = 0;
    int val, nrList, aux, len;
    for(int i = left; i < right; ++i)
        ++End[(v[i] >> bits) & MASK];
    Begin[0] = left;
    End[0] += left;
    for(int i = 1; i < (1 << BITS); ++i) {
        Begin[i] = End[i - 1];
        End[i] += End[i - 1];
    }

    for(int i = 0; i < (1 << BITS); ++i) {
        while(Begin[i] != End[i]) {
            val = v[Begin[i]];
            nrList = (val >> bits) & MASK;
            while(nrList != i) {
                aux = v[Begin[nrList]];
                v[Begin[nrList]++] = val;
                val = aux;
                nrList = (val >> bits) & MASK;
            }
            v[Begin[i]++] = val;
        }
    }

    if(bits) {
        for(int i = 0; i < (1 << BITS); ++i) {
            if(i)
                len = End[i] - End[i - 1];
            else len = End[i] - left;
            if(len > LIMIT)
                radixSort(End[i] - len, End[i], bits - BITS);
            else if(len > 1)
                selectionSort(End[i] - len, End[i]);
        }
    }
}

int main() {
    int n, a, b, c;
    ifstream fin("radixsort.in");
    ofstream fout("radixsort.out");
    fin >> n >> a >> b >> c;
    v[0] = b;
    for(int i = 1; i < n; ++i) {
        v[i] = (1LL * a * v[i - 1] + b) % c;
    }
    radixSort(0, n, 24);
    for(int i = 0; i < n; i += 10)
        fout << v[i] << " ";
    fout << "\n";
    fin.close();
    fout.close();
    return 0;
}