Cod sursa(job #1389134)

Utilizator alexandru70Ungurianu Alexandru alexandru70 Data 16 martie 2015 01:39:38
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <vector>

using namespace std;

vector<unsigned> sort_by_byte(vector<unsigned> &&data, unsigned byte) {
	vector<unsigned> result(data.size());
	vector<unsigned> count(256,0);
	auto key = [byte] (unsigned x) -> unsigned {return (x >> (byte*8)) & 0xFF;};

	for(unsigned val:data) {
		count[key(val)]++;
	}
	unsigned total = 0;
	for(size_t i = 0; i < 256; ++i) {
		unsigned oldCount = count[i];
		count[i] = total;
		total += oldCount;
	}

	for(unsigned val:data) {
		result[count[key(val)]] = val;
		count[key(val)]++;
	}

	return move(result);
}

vector<unsigned> sort(vector<unsigned> &&data) {
	for(size_t i = 0; i < 4; ++i)
		data = sort_by_byte(move(data),i);
	return move(data);
}

int main() {

	ifstream in("radixsort.in");
	unsigned n,a,b,c;

	in >> n >> a >> b >> c;

	vector<unsigned> data(n);
	data[0] = b;

	for(int i = 1; i < n; ++i) {
		data[i] = (a*data[i-1] + b) % c;
	}

	data = sort(move(data));

	ofstream out("radixsort.out");
	for(size_t i = 0; i < n; i += 10) {
		out << data[i] << ' ';
	}
}