1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6

# конспект · шаг 6 из 6

Конспект: пирамидальная сортировка

выжимка - её можно унести в заметки

Понятия

Двоичная куча - почти полное двоичное дерево со свойством: родитель ≥ детей (макс-куча), поэтому максимум в корне. Хранится в МАССИВЕ: у узла i дети 2i+1 и 2i+2, родитель (i−1)//2 - без ссылок.

Просеивание вниз (sift-down) - восстановление свойства: меняем узел с бо́льшим ребёнком, пока он не станет ≥ детей. Идёт по высоте дерева - O(log n).

Построение кучи - просеивание вниз по узлам СНИЗУ ВВЕРХ (от n//2 − 1 до 0). Стоит Θ(n), а не Θ(n·log n): узлов высоты h около n/2^(h+1), сумма n·Σ h/2ʰ сходится к Θ(n).

Пирамидальная сортировка - построить макс-кучу, затем n − 1 раз: поменять корень (максимум) с последним элементом кучи, ужать кучу, просеять новый корень. Θ(n·log n) при любом входе, на месте, НЕ устойчива.

Очередь с приоритетом - структура «достать самый важный»; реализуется кучей.

Что унести

Куча - это компромисс между отсортированным и неотсортированным массивом: максимум под рукой (O(1)), а вставка и удаление максимума - O(log n). Свойство связывает только родителя с детьми; куча НЕ отсортирована.

Построение за Θ(n) - важный факт: грубая оценка n × log n завышена, потому что почти все узлы у дна и просеиваются почти никуда. Ряд Σ h/2ʰ сходится к константе. Направление решает: sift-down снизу вверх - Θ(n); добавление по одному (sift-up) - Θ(n·log n).

Пирамидальная сортировка сравнительно с другими n·log n:

слиянием быстрая пирамидальная
время (худш.) Θ(n·log n) Θ(n²) Θ(n·log n)
память Θ(n) Θ(log n) O(1), на месте
устойчива да нет нет

Уникальность пирамидальной - гарантия n·log n И работа на месте одновременно. Отсюда её роль страховки в introsort (переключение при глубокой рекурсии быстрой) и выбор при дефиците памяти. На практике по КОНСТАНТЕ чуть медленнее быстрой (прыжки по массиву плохо ложатся на кеш - локальность памяти).

Ловушки джокера

Перепутал формулы индексов (родитель как i//2 вместо (i−1)//2). Переходы промахиваются, куча ломается молча.

При просеивании меняешь узел с любым ребёнком, а не с большим. Наверх поднимется не максимум, свойство не восстановится.

Строишь кучу сверху вниз (с корня). Опираешься на непочиненные поддеревья - куча не соберётся. Начинай с n//2 − 1.

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

Считаешь построение кучи за Θ(n·log n). Оно Θ(n) - плата за лишний log n на больших данных.

Проверь себя

Что такое свойство кучи и как она укладывается в массив?

Почему просеивание - O(log n), а построение кучи - Θ(n), а не Θ(n·log n)?

Как работает пирамидальная сортировка по шагам?

Почему она укладывается в O(n·log n) при любом входе и работает на месте?

Почему она не устойчива и где её берут как страховку?

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.