Cod sursa(job #2351504)

Utilizator leeviiTempfli Levente2 leevii Data 22 februarie 2019 14:37:50
Problema Radix Sort Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

long long n, a, b, c;

int v[10000000];
int r[10000000];
int x[67108864];

int *vp, *rp, *ch;
int digits;

void read() {
	fin >> n >> a >> b >> c;
}
void generate() {
	int mx = 0;
	v[0] = b;
	for (int i = 1; i < n; i++) {
		v[i] = (a*v[i - 1] + b) % c;
		if (v[i] > mx) mx = v[i];
	}
	vp = v;
	rp = r;
	while (mx != 0) {
		digits++;
		mx /= 67108864;
	}
}

void sort2() {
	int dv = 1, t;
	for (int j = 1; j <= digits; j++) {
		for (int i = n - 1; i >= 0; i--) {
			x[(vp[i]/dv)% 67108864]++;
		}
		for (int i = 1; i < 67108864; i++) {
			x[i] += x[i - 1];
		}
		for (int i = n - 1; i >= 0; i--) {
			t = (vp[i] / dv) % 67108864;
			x[t]--;
			rp[x[t]] = vp[i];
		}
		for (int i = 1; i < 67108864; i++) {
			x[i] = 0;
		}
		dv *= 67108864;
		ch = rp;
		rp = vp;
		vp = ch;
	}
}

void write() {
	for (int i = 0; i < n; i += 10) {
		fout << vp[i] << " ";
	}
}

int main() {
	read();
	generate();
	sort2();
	write();
	return 0;
}