def radix_sort_visual():
    global array
    max_num = max(array)
    exp = 1  # Начинаем с разряда единиц
    while max_num // exp > 0:
        # Подсчитываем количество элементов для каждого разряда
        count = [0] * 10
        output = [0] * len(array)

        for num in array:
            index = (num // exp) % 10
            count[index] += 1

        # Преобразуем count в префиксную сумму
        for i in range(1, 10):
            count[i] += count[i - 1]

        # Строим выходной массив
        i = len(array) - 1
        while i >= 0:
            num = array[i]
            index = (num // exp) % 10
            output[count[index] - 1] = num
            count[index] -= 1
            i -= 1

        # Копируем выходной массив обратно в основной массив
        for i in range(len(array)):
            array[i] = output[i]

        # Визуализируем состояние массива после каждого разряда
        screen.fill(WHITE)
        for k, value in enumerate(array):
            pygame.draw.rect(screen, BLUE, (k * BAR_WIDTH, HEIGHT - value - 50, BAR_WIDTH - 2, value))
        pygame.draw.rect(screen, RED, button_random)
        pygame.draw.rect(screen, RED, button_algorithm)
        pygame.draw.rect(screen, RED, button_sort)
        screen.blit(font.render("Генерировать массив", True, WHITE), (button_random.x + 30, button_random.y + 5))
        screen.blit(font.render("Отсортировать", True, WHITE), (button_sort.x + 30, button_sort.y + 5))
        screen.blit(font.render(selected_algorithm, True, WHITE), (button_algorithm.x + 30, button_algorithm.y + 5))
        pygame.display.flip()
        time.sleep(0.05)
        
        exp *= 10  # Переход к следующему разряду



            

// Функция поразрядной сортировки
void radixSort(sf::RenderWindow& window) {
    int maxVal = *std::max_element(array.begin(), array.end());
    int exp = 1;

    while (maxVal / exp > 0) {
        std::vector output(array.size());
        std::vector count(10, 0);

        // Подсчет частоты появления цифр по текущему разряду
        for (int i = 0; i < array.size(); i++) {
            int digit = (array[i] / exp) % 10;
            count[digit]++;
        }

        // Преобразуем count[i] так, чтобы в нем было хранение позиции каждого числа
        for (int i = 1; i < 10; i++) {
            count[i] += count[i - 1];
        }

        // Строим выходной массив
        for (int i = array.size() - 1; i >= 0; i--) {
            int digit = (array[i] / exp) % 10;
            output[count[digit] - 1] = array[i];
            count[digit]--;
        }

        // Копируем выходной массив обратно в array
        array = output;

        // Отображаем состояние массива после каждого разряда
        window.clear(sf::Color::White);

        for (int i = 0; i < array.size(); i++) {
            sf::RectangleShape bar(sf::Vector2f(BAR_WIDTH - 2, array[i]));
            bar.setPosition(i * BAR_WIDTH, HEIGHT - array[i] - 50);
            bar.setFillColor(sf::Color::Blue);
            window.draw(bar);
        }

        window.display();
        std::this_thread::sleep_for(std::chrono::milliseconds(50));

        exp *= 10;
    }
}