Pagini recente » Cod sursa (job #3179216) | Cod sursa (job #2150516) | Cod sursa (job #1863290) | Cod sursa (job #2408481) | Cod sursa (job #3133106)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
// Funcție pentru a returna cifra specificată a unui număr
int getDigit(int number, int digit) {
while (digit > 1) {
number /= 10;
digit--;
}
return number % 10;
}
// Funcție pentru a aplica Counting Sort pe baza cifrei specifice
void countingSort(vector<int>& numbers, int digit) {
const int k = 10; // Numărul de cifre posibile (0-9)
vector<int> count(k, 0);
vector<int> sortedNumbers(numbers.size());
// Numărăm frecvența apariției fiecărei cifre
for (int number : numbers) {
int currentDigit = getDigit(number, digit);
count[currentDigit]++;
}
// Calculăm poziția fiecărui număr în vectorul sortat
for (int i = 1; i < k; i++) {
count[i] += count[i - 1];
}
// Rearanjăm numerele în vectorul sortat
for (int i = numbers.size() - 1; i >= 0; i--) {
int number = numbers[i];
int currentDigit = getDigit(number, digit);
int& position = count[currentDigit];
sortedNumbers[position - 1] = number;
position--;
}
// Actualizăm vectorul de numere cu vectorul sortat
numbers = sortedNumbers;
}
// Funcție pentru a aplica Radix Sort pe vectorul de numere
void radixSort(vector<int>& numbers) {
int maxNumber = *max_element(numbers.begin(), numbers.end());
// Determinăm numărul maxim de cifre din numere
int maxDigits = 0;
while (maxNumber > 0) {
maxNumber /= 10;
maxDigits++;
}
// Aplicăm Counting Sort pe baza fiecărei cifre
for (int digit = 1; digit <= maxDigits; digit++) {
countingSort(numbers, digit);
}
}
int main() {
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
int N, A, B, C;
fin >> N >> A >> B >> C;
vector<int> numbers(N);
numbers[0] = B;
for (int i = 1; i < N; i++) {
numbers[i] = (A * numbers[i - 1] + B) % C;
}
radixSort(numbers);
for (int i = 0; i < N; i += 10) {
fout << numbers[i] << " ";
}
fout << endl;
fin.close();
fout.close();
return 0;
}