Cod sursa(job #1333497)

Utilizator atoaderAlexandru Toader atoader Data 3 februarie 2015 11:20:35
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdint.h>
#include <limits>
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

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

void read(vector<int>& data)
{
	ifstream f("radixsort.in");
	int N, A, B, C;
	f >> N >> A >> B >> C;

	data.push_back(B);

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

		data.push_back(x);
	}

	f.close();
}

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

	for (size_t i = 0; i < data.size(); i += 10 ){
		g << data[i] << " ";
	}

	g << endl;

	g.close();
}

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

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

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

		for (int 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];
		}

		for (int j = 0; j < SIZE; ++j){
			data[j] = b[j];
		}

		shift += r;		
	}
}

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