Cod sursa(job #2649510)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 14 septembrie 2020 23:17:35
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <vector>

using namespace std;

int numbers[10000000];
int buckets[10000000];

int main () {
	freopen("radixsort.in", "r", stdin);
	freopen("radixsort.out", "w", stdout);

	int n, a, b, c, maxNo;
	int counts[10];

	scanf("%d", &n);
    scanf("%d%d%d", &a, &b, &c);
    numbers[0] = b;
    maxNo = b;
    for(int i=1; i<n; ++i) {
        numbers[i] = (a * numbers[i-1] + b) % c;
        if (numbers[i] > maxNo)
            maxNo = numbers[i];
    }

	int current_digit = 1, current;

	while(maxNo / current_digit) {
		for(int i=0; i<=9; ++i)
			counts[i] = 0;

        for(int i=0; i<n; ++i) {
			current = numbers[i] / current_digit % 10;
			++counts[current];
        }

        for(int i=1; i<=9; ++i)
            counts[i] += counts[i-1];

		for(int i=n-1; i>=0; --i) {
			current = numbers[i] / current_digit % 10;
			buckets[counts[current] - 1] = numbers[i];
			--counts[current];
		}

		for(int i=0; i<n; ++i)
            numbers[i] = buckets[i];
		current_digit *= 10;
	}

	for(int i=0; i<n; i+= 10)
		printf("%d ", numbers[i]);

	return 0;
}