Когда объясняешь школьникам или студентам, как работает сортировка, графика говорит громче слов. Наверняка, в интернете полно обзоров и сравнительных анализов различных алгоритмов сортировки, но я не нашел ничего что объединяло бы самые популярные алгоритмы в одном сравнительном экстазе. Поэтому я написал визуализатор, который показывает в реальном времени, как разные алгоритмы сортируют один и тот же массив — одновременно.

Зачем нужен визуализатор

Когда мы говорим о «скорости сортировки», большинство представляет себе просто числа и асимптотику 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.

Пример визуализации

На скриншоте видно, как пузырьковая сортировка отстаёт от QuickSort и HeapSort; Merge и TimSort идут синхронно, но более плавно
На скриншоте видно, как пузырьковая сортировка отстаёт от QuickSort и HeapSort; Merge и TimSort идут синхронно, но более плавно
  • Pygame обеспечивает стабильный FPS (60 кадров/с) и простое управление окнами.

  • Все сортировки написаны на чистом Python — без NumPy.

  • Генераторы позволяют элегантно «пошагово» наблюдать процесс.

  • Для каждого алгоритма сохраняется отдельная копия массива, чтобы стартовые условия были одинаковыми.

Результат и выводы

Разумеется, результат абсолютно предсказуемый, но мною преследовалась цель повысить наглядность при сравнении скорости сортировки раличных алгоритмов:

  • Пузырьковая сортировка — самая медленная (как и ожидалось).

  • QuickSort и HeapSort лидируют.

  • MergeSort стабильно быстра, но требуе�� больше движений.

  • TimSort показывает плавное, оптимизированное поведение, почти как в реальной сортировке Python.

Можно было бы добавить еще алгоритмы RadixSort, CountingSort, BucketSort, но, как по мне, они слишком специфичны по отношению к сортируемым данным.

Этот проект — отличный пример, как можно совместить:

  • классическую алгоритмическую теорию,

  • простую визуализацию на Python,

  • и интерактивное обучение.

Полезно для школьников, студентов и просто тех, кто любит видеть, как алгоритмы оживают, визуалов и просто фанатов инфографики :)

Ну и, как полагается, исходный код доступен на GitHub

На вики можно почитать про каждый алгоритм более подробно

Комментарии (6)


  1. ASenchenko
    25.10.2025 20:13

    Найти видео с разными методами сортировки можно конечно, но там они обычно последовательно.

    Объединить в одном окне ‐ хорошая идея


    1. ilyasch Автор
      25.10.2025 20:13

      Да, собственно, эта мысль основополагающей и была :) Спасибо


  1. dyadyaSerezha
    25.10.2025 20:13

    Мало типов в коде, мало)


  1. Abbadosha
    25.10.2025 20:13

    Не только студентам, даже начинающим специалистам будет полезно.


    1. lex899
      25.10.2025 20:13

      Начинающие специалисты дергают sort() или quickSort() из стандартной библиотеки.

      1. Пузырек быстрее всего пишется

      2. Слияние быстрее всего пока хватает памяти

      3. Бинарная вставка быстрее всего при дорогих сравнениях

      4. При дорогих перестановках сортируем по индексам а потом распутываем цепочки перестановок


  1. VAF34
    25.10.2025 20:13

    Спасибо! Все работает и очень наглядно.