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