Когда объясняешь школьникам или студентам, как работает сортировка, графика говорит громче слов. Наверняка, в интернете полно обзоров и сравнительных анализов различных алгоритмов сортировки, но я не нашел ничего что объединяло бы самые популярные алгоритмы в одном сравнительном экстазе. Поэтому я написал визуализатор, который показывает в реальном времени, как разные алгоритмы сортируют один и тот же массив — одновременно.
Зачем нужен визуализатор
Когда мы говорим о «скорости сортировки», большинство представляет себе просто числа и асимптотику O(n log n).
Но если вы хоть раз увидите, как пузырьковая сортировка «ползёт» по массиву, а QuickSort разлетается молнией, — асимптотика станет куда понятнее.
Так появилась идея: сделать наглядную, динамическую визуализацию, где все алгоритмы сортируют одни и те же данные параллельно.
Что делает программа
Программа строит окно Pygame, разбитое на несколько панелей (по одной на каждый алгоритм).
На каждой панели — набор прямоугольных столбиков, представляющих элементы массива.
Высота — значение, цвет — алгоритм.
Визуализация 10 алгоритмов сортировки одновременно
Пошаговая анимация — видно каждый обмен элементов
Реальное сравнение скорости и динамики алгоритмов
Управление в реальном времени (пауза, перезапуск, скорость)
Полностью на чистом Python, без внешних зависимостей кроме
pygame
Во время работы:
Все алгоритмы запускаются на одной и той же случайной выборке чисел.
Каждый шаг сортировки отрисовывается в реальном времени.
Можно ставить на паузу, перезапускать с новой выборкой, или наблюдать завершение каждого метода.
Поддерживаемые алгоритмы
Визуализатор реализует все классические алгоритмы сортировки на Python (через генераторы):
Категория | Алгоритмы |
|---|---|
Простые | Bubble, Selection, Insertion |
Быстрые | Quick, Merge, Heap |
Гибридные | Shell, Comb, Gnome |
Реальные | TimSort (как в Python) |
Каждый алгоритм реализован как генератор, который yield-ит текущее состояние массива.
Это позволяет синхронно отрисовывать прогресс и наблюдать шаг за шагом.
Чуть более подробно про каждый из алгоритмов
1. Bubble Sort (пузырьковая сортировка)
Тип: простая, учебная
Сл��жность: O(n²)
Принцип: последовательно «всплывает» максимальный элемент в конец массива, сравнивая соседние пары.
Особенности: крайне медленная, но идеальна для демонстрации.
2. Selection Sort (сортировка выбором)
Тип: простая, сравнительная
Сложность: O(n²)
Принцип: находит минимум из оставшейся части и ставит его на текущее место.
Особенности: делает минимум обменов, но остаётся медленной.
3. Insertion Sort (сортировка вставками)
Тип: простая, адаптивная
Сложность: O(n²) в худшем, O(n) в лучшем
Принцип: вставляет каждый элемент на своё место в уже отсортированной части.
Особенности: быстра для почти отсортированных массивов.
4. Merge Sort (сортировка слиянием)
Тип: рекурсивная, стабильная
Сложность: O(n log n)
Принцип: делит массив пополам, сортирует рекурсивно, потом сливает.
Особенности: стабильная, требует доп. памяти (O(n)).
5. Quick Sort (быстрая сортировка)
Тип: рекурсивная, сравнительная
Сложность: O(n log n) в среднем, O(n²) в худшем
Принцип: выбирает опорный элемент, разделяет массив на меньшие/большие.
Особенности: самая быстрая в среднем, не стабильная.
6. Heap Sort (пирамидальная сортировка)
Тип: сравнительная, не рекурсивная
Сложность: O(n log n)
Принцип: строит двоичную кучу и последовательно извлекает максимум.
Особенности: не требует доп. памяти, всегда предсказуемая скорость.
7. Shell Sort (сортировка Шелла)
Тип: улучшение вставок
Сложность: от O(n log² n) до O(n^(3/2)), в зависимости от шага
Принцип: сортирует элементы через определённые промежутки (gap), постепенно уменьшая gap.
Особенности: часто используется для больших почти-отсортированных массивов.
8. Comb Sort (расчёстка)
Тип: улучшение пузырьковой
Сложность: O(n²) (на практике быстрее Bubble)
Принцип: похожа на пузырьковую, но сравнивает элементы через уменьшающийся «зазор».
Особенности: быстрее пузырьковой, простой код.
9. Gnome Sort (садовая сортировка)
Тип: экзотическая вариация вставок
Сложность: O(n²)
Принцип: похожа на сортировку вставками, но с интуитивным «шагом назад» при обмене.
Особенности: визуально интересная, «шагает» по массиву, как гном с цветами 🌼
10. TimSort
Тип: гибрид Merge + Insertion
Сложность: O(n log n)
Принцип: делит массив на небольшие блоки (runs), сортирует вставками и сливает.
Особенности: используется в Python (list.sort, sorted) и Java — один из лучших реальных алгоритмов сортировки.
Техническая реализация
Основная идея
Главная структура — это словарь генераторов:
generators = {name: func(list(arr)) for name, func in ALGORITHMS.items()}
arrays = {name: list(arr) for name in ALGORITHMS.keys()}
Каждый кадр цикла main() вызывает:
state = next(gen)
arrays[name] = state
и сразу же перерисовывает панели.
Интерфейс
ESC — выход
SPACE — пауза / продолжение
R — перезапустить с новой случайной выборкой
Экран делится на сетку cols × rows, каждая ячейка отображает один алгоритм.
Пример при 10 алгоритмах — сетка 5×2.
Пример визуализации

Pygame обеспечивает стабильный FPS (60 кадров/с) и простое управление окнами.
Все сортировки написаны на чистом Python — без NumPy.
Генераторы позволяют элегантно «пошагово» наблюдать процесс.
Для каждого алгоритма сохраняется отдельная копия массива, чтобы стартовые условия были одинаковыми.
Результат и выводы
Разумеется, результат абсолютно предсказуемый, но мною преследовалась цель повысить наглядность при сравнении скорости сортировки раличных алгоритмов:
Пузырьковая сортировка — самая медленная (как и ожидалось).
QuickSort и HeapSort лидируют.
MergeSort стабильно быстра, но ��ребует больше движений.
TimSort показывает плавное, оптимизированное поведение, почти как в реальной сортировке Python.
Можно было бы добавить еще алгоритмы RadixSort, CountingSort, BucketSort, но, как по мне, они слишком специфичны по отношению к сортируемым данным.
Этот проект — отличный пример, как можно совместить:
классическую алгоритмическую теорию,
простую визуализацию на Python,
и интерактивное обучение.
Полезно для школьников, студентов и просто тех, кто любит видеть, как алгоритмы оживают, визуалов и просто фанатов инфографики :)
Ну и, как полагается, исходный код доступен на GitHub
На вики можно почитать про каждый алгоритм более подробно