Cod sursa(job #1333470)

Utilizator atoaderAlexandru Toader atoader Data 3 februarie 2015 10:57:09
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdint.h>
#include <limits>
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

const int MAX_ELEMENTS = 500010;
uint32_t A, B, C;
int N;

const uint32_t digits = 4;//Digits
const uint32_t r = 8;//Bits
const uint32_t radix = 1 << r; //Buckets
const uint32_t mask = radix - 1; //BitMaksk

void read(vector<uint32_t>& data)
{
	ifstream f("radixsort.in");

	f >> N >> A >> B >> C;

	data.push_back(B);

	for (int i = 1; i < N; i++){
		data.push_back((A*data[i - 1] + B) % C);
	}

	f.close();
}

void write(const vector<uint32_t>& data)
{
	ofstream g("radixsort.out");

	for (int i = 1; i < N; i = i + 10){
		g << data[i] << " ";
	}

	g << endl;
}

void radixSort(vector<uint32_t>& data){
	const int SIZE = data.size();
	vector<uint32_t> b(SIZE);
	vector<uint32_t> bucket(radix);
	uint32_t shift = 0;

	for (uint32_t i = 0; i < digits; i++){
		for (uint32_t j = 0; j < radix; j++){
			bucket[j] = 0;
		}

		for (int j = 0; j < SIZE; j++){
			bucket[(data[j] >> shift) & mask]++;
		}

		for (uint32_t j = 1; j < radix; j++){
			bucket[j] += bucket[j - 1];
		}

		for (int j = SIZE - 1; j >= 0; --j){
			b[--bucket[(data[j] >> shift) & mask]] = data[j];
		}

		shift += r;
		data = b;
	}
}

int main(){
	vector<uint32_t> data;
	read(data);
	radixSort(data);
	write(data);
}