Cod sursa(job #1108904)

Utilizator ibicecIT Zilla ibicec Data 16 februarie 2014 15:04:42
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <vector>
#include <queue>
#include <fstream>

using namespace std;

int num_digits(int n) {
	int len = 1;
	while ( n/10 ) {
		len++;
		n /= 10;
	}
	return len;
}

int main() {
	vector<queue<int>> queues(10);

	int N, A, B, C;
	ifstream in("radixsort.in");
	in >> N >> A >> B >> C;
	in.close();

	vector<int> v(N);
	v[0] = B;
	int max_len = num_digits(v[0]);

	// building input vector
	for (int i = 1; i < N; i++) {
		v[i] = (A*v[i - 1] + B) % C;
		// keeping track of the longest number
		int num_len = num_digits(v[i]);
		if (num_len > max_len){
			max_len = num_len;
		}
	}

	int n = 10;
	int m = 1;

	vector<int>::iterator vIter;
	for (int i = 0; i < max_len; i++) {
		for (vIter = v.begin(); vIter != v.end(); vIter++) {
			queues[(*vIter % n) / m].push(*vIter);
		}

		int k = 0;
		vector<queue<int>>::iterator qIter;
		for (qIter = queues.begin(); qIter != queues.end(); qIter++) {
			while (!(*qIter).empty()) {
				v[k++] = (*qIter).front();
				(*qIter).pop();
			}
		}

		n *= 10;
		m *= 10;
	}

	ofstream out("radixsort.out");

	for (int i = 0; i < N; i += 10) {
		out << v[i] << " ";
	}

	out.close();


}