Получить доступ

Какие алгоритмы сортировки вы знаете и чем они отличаются?

JuniorСортировки
Ещё спрашивают так:
  • Какой алгоритм сортировки самый быстрый?
  • Сравните сортировку пузырьком, вставками, слиянием и быструю
  • Какая сортировка используется в стандартных библиотеках?
Коротко

Простые — пузырьком, вставками, выбором — O(n²); эффективные — слиянием, быстрая, пирамидальная — O(n log n). Отличаются худшим случаем, памятью и устойчивостью.

  • Вставки хороши на почти отсортированных и малых массивах — O(n) в лучшем случае
  • Быстрая — обычно самая быстрая на практике, но O(n²) в худшем; слияние — устойчиво, но O(n) памяти

А ещё В стандартных библиотеках — гибриды: Timsort (Python, Java для объектов), introsort (C++)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Сортировки по шагам: пузырёк, вставки, выбор, слияние, быстрая, пирамидальная

Подробно

АлгоритмЛучшийСреднийХудшийПамятьУстойчива
ПузырькомO(n)O(n²)O(n²)O(1)да
ВставкамиO(n)O(n²)O(n²)O(1)да
ВыборомO(n²)O(n²)O(n²)O(1)нет
СлияниемO(n log n)O(n log n)O(n log n)O(n)да
БыстраяO(n log n)O(n log n)O(n²)O(log n)нет
ПирамидальнаяO(n log n)O(n log n)O(n log n)O(1)нет

Как они работают в двух словах:

  • пузырьком — соседние пары меняются местами, большие «всплывают» в конец;
  • вставками — каждый элемент вставляется на место в уже упорядоченную левую часть; на почти отсортированных данных почти ничего не двигает;
  • выбором — ищем минимум оставшейся части и ставим вперёд;
  • слиянием — делим пополам, сортируем половины, сливаем;
  • быстрая — выбираем опорный, раскладываем меньшие влево, большие вправо, сортируем части;
  • пирамидальная — строим кучу и по одному извлекаем максимум.

Что используется на практике: Timsort (Python, Java для объектов) — слияние плюс вставки для коротких отрезков, отлично работает на частично упорядоченных данных и устойчив; introsort (C++ std::sort) — быстрая сортировка, которая при слишком глубокой рекурсии переключается на пирамидальную, а мелкие части досортировывает вставками. Java для примитивов использует быструю сортировку с двумя опорными.

Ответ на «какая самая быстрая» — зависит от данных: размера, степени упорядоченности, нужна ли устойчивость и сколько есть памяти.

Что хотят услышать

  • Деление на простые O(n²) и эффективные O(n log n).
  • Лучший, средний и худший случаи, память, устойчивость.
  • Когда простая сортировка уместна (вставки на почти отсортированных).
  • Что используют стандартные библиотеки.

Частые ошибки

  • «Быстрая сортировка всегда O(n log n)».
  • Не знать, что такое устойчивость сортировки.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем