Cod sursa(job #2076840)

Utilizator belgun_adrianBelgun Dimitri Adrian belgun_adrian Data 27 noiembrie 2017 11:14:27
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
// VS workaround
#define _CRT_SECURE_NO_WARNINGS

#include <cmath>
#include <cstdio>
#include <vector>
#include <list>
#include <iostream>
#include <algorithm>

#include <cstdio>

using namespace std;

void sort(const std::vector<int>& v, std::vector<int>& t, int byte) {
	int mask = 0xFF;
	int shift = byte * 8;

	std::vector<int> count(mask + 1, 0);

	// Frequencies
	for (int x : v) {
		int key = (x >> shift) & 0xFF;
		count[key + 1]++;
	}

	// CDF
	for (int i = 0; i < mask; i++) {
		count[i + 1] += count[i];
	}

	// Put answer into output
	for (int x : v) {
		int key = (x >> shift) & 0xFF;
		t[count[key]] = x;
		count[key]++;
	}

}

void print(const std::vector<int>& v) {
	for (int x : v)
		printf("%d ", x);
}

int main() {
	int n, a, b, c;

	FILE *f = fopen("radixsort.in", "r");
	fscanf(f, "%d %d %d %d", &n, &a, &b, &c);
	fclose(f);

	std::vector<int> v(n);
	std::vector<int> t(n);
	v[0] = b;
	for (int i = 1; i < n; i++)
		v[i] = (a * v[i - 1] + b) % c;

	sort(v, t, 0);
	sort(t, v, 1);
	sort(v, t, 2);
	sort(t, v, 3);

	f = fopen("radixsort.out", "w");
	for (int i = 0; i < n; i += 10)
		fprintf(f, "%d ", v[i]);
	fclose(f);


	return 0;
}