Cod sursa(job #2611195)

Utilizator minecraft3Vintila Valentin Ioan minecraft3 Data 6 mai 2020 15:57:46
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("radixsort.in");
ofstream fout("radixsort.out");

#define N 10000000

#define B 256
#define NC 4
int n, v[2][N], nr[B+2], poz[B+2];

int main() {
    /*
    v = {59, 14, 98, 38, 110, 80, 23, 2, 50, 71}
    
    i) sortam dupa ultima cifra =>
    v = {110, 80, 50, 71, 2, 23, 14, 98, 38, 59}

    ii) ordonam dupa cifra zecilor =>
    v = {2, 110, 14, 23, 38, 50, 59, 71, 80, 98}

    iii) sortam dupa cifra sutelor =>
    v = {2, 14, 23, 38, 50, 59, 71, 80, 98, 110}
    
    --------------------------------------------
           0  1  2  3  4  5  6  7  8  9
    nr =  {3, 1, 1, 1, 1, 0, 0, 0, 2, 1}
    poz = {0, 3, 4, 5, 6, 7, 7, 7, 7, 9}

    poz[i] = poz[i-1] + nr[i-1]; poz[0] = 0
    --------------------------------------------
    */

   	int a, c;
   	fin >> n >> a >> v[0][0] >> c;
	for(int i = 1; i < n; ++i)
		v[0][i] = (1ll * a * v[0][i-1] + v[0][0]) % c;

	for(int k = 0, p = 1; k < NC; ++k, p *= B) {
		for(int j = 0; j < B; ++j)
			nr[j] = 0;
		for(int i = 0; i < n; ++i)
			nr[v[k%2][i] / p % B]++;
		poz[0] = 0; for(int j = 1; j < B; ++j)
			poz[j] = poz[j-1] + nr[j-1];
		for(int i = 0; i < n; ++i)
			v[(k+1)%2][poz[v[k%2][i] / p % B]++] = v[k%2][i];
	}

	for(int i = 0; i < n; i += 10)
		fout << v[NC%2][i] << ' ';

    return 0;
}