Деление на ноль

Турнирная сортировка: интерактивная анимация (Tournament Sort)

Используем турнирную сетку на выбывание для быстрого нахождения минимума

Визуализация

Данные: Случайные
Данные:

Турнирная сетка - элементы играют матчи

Результат - извлеченные чемпионы

Легенда цветов
победитель матча / узел дерева сравниваемая пара чемпион (минимум) / отсортировано выбывший лист (∞)
Нажмите "Пуск" или листайте по шагам.
Сравнения: 0 Текущий чемпион: - Шаг: 0 / 0 Сложность по времени: -

Как работает турнирная сортировка

Идея алгоритма: Мы размещаем элементы массива в листьях полного двоичного дерева (турнирной сетки) и проводим матчи: каждый внутренний узел становится минимальным из своих двух детей. Победитель (минимальный элемент) всплывает к корню дерева и становится чемпионом турнира. После извлечения чемпиона в отсортированный массив, его лист заменяется на бесконечность (выбывает), и мы переигрываем матчи только на пути от этого листа до корня, чтобы найти следующего чемпиона.

Сложность алгоритма

Сложность - это оценка того, как быстро растет потребление ресурса при росте длины массива n. Ресурса у алгоритма два, поэтому и оценки две: по времени и по памяти. Обе записывают через O-нотацию - у нас есть отдельная анимация о том, как читать такие записи. Турнирная сортировка работает за время O(n log n) в любом случае.

По времени

Показывает, как растет число операций (здесь это сравнения и переигранные матчи) при росте n. Первичное построение дерева требует n-1 сравнений (O(n)). На каждое из n извлечений мы тратим время, пропорциональное высоте дерева, то есть O(log n). Итоговое время: O(n log n).

Случай Время Комментарий
Лучший случай O(n log n) Даже для отсортированного массива придется построить турнирную сетку и переиграть путь для каждого элемента.
Средний случай O(n log n) Каждое извлечение требует O(log n) операций для обновления пути.
Худший случай O(n log n) Строгая верхняя граница, никаких сюрпризов.

По памяти

Показывает, сколько дополнительной памяти нужно алгоритму. Сам входной массив в эту оценку не входит: дополнительной считается память сверх него. В отличие от пирамидальной сортировки, турнирная сетка не может быть легко уложена в сам исходный массив, поскольку элементы находятся только в листьях, а внутренние узлы хранят победителей. Поэтому требуется выделение памяти под дерево.

Характеристика Оценка Комментарий
Дополнительная память O(n) Для турнирной сетки нужно полное двоичное дерево. Если листьев n, то всего в дереве 2*n-1 узлов.

Устойчивость алгоритма

Устойчивой называется сортировка, которая не меняет взаимный порядок равных элементов. Пример: сортируем учеников по оценке, а внутри одной оценки они уже стояли по алфавиту. Устойчивая сортировка сохранит алфавитный порядок внутри каждой оценки, неустойчивая - может перемешать. Турнирная сортировка является устойчивой, если при равенстве элементов победителем всегда признается левый потомок.

Характеристика Оценка Комментарий
Устойчивость Да Если при сравнении a <= b (где a - левый потомок) победителем становится левый элемент, то равные элементы извлекаются в исходном порядке.

Примеры реализации турнирной сортировки (Tournament Sort)

Хотите разобрать тему глубже? В нашем бесплатном курсе есть урок про турнирную сортировку - с подробной теорией, задачами и проверочными вопросами.