Cod sursa(job #3133104)

Utilizator IsaacAvramescu Isaac Sebastian Isaac Data 25 mai 2023 08:58:06
Problema Radix Sort Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <vector>

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;
}