Алгоритмы с нуля
Сортировка и поиск: тест с выбором
Шесть вопросов через весь юнит. Каждый — это решение, которое вы принимаете, когда берётесь за сортировку или поиск в реальном коде: не определение для пересказа, а компромисс, который надо взвесить.
Убедитесь, что вы связываете стержень юнита: сортировка — это препроцессинг, за который платят один раз; сортировки за O(n log n) меняют stable-свойство на память и худший случай; а binary search обобщается с массивов на любое монотонное пространство ответов.
Вам пришёл неотсортированный массив из 1 000 000 элементов, и нужно ответить ровно на один запрос: есть ли в нём значение X? Какой подход дешевле всего и при этом корректен?
Вы сортируете список заказов по сумме, где несколько заказов имеют одинаковую сумму, и нужно, чтобы при равенстве сохранялся исходный порядок поступления. Какая сортировка безопасна?
Merge sort и quicksort оба O(n log n) в среднем. Для сортировки огромного массива на месте при жёстком ограничении по памяти и без требования stable — почему quicksort часто выбирают в продакшене?
Quicksort, который всегда берёт последний элемент как pivot, нормально работает на случайных данных, но тратит минуты на уже отсортированных. Почему и как это стандартно чинят?
Binary search использует while (lo < hi) с hi = arr.length - 1 и возвращает -1 после цикла. На большинстве входов он работает, но промахивается, когда цель стоит в позиции, где lo равно hi. В чём дефект?
Нужно найти минимальную грузоподъёмность корабля, чтобы доставить все посылки за D дней, и нет отсортированного массива грузоподъёмностей, по которому можно индексироваться. Когда binary search всё равно применим?
Сквозная мысль юнита — одна привычка: решить, стоит ли покупать порядок. Сортируйте, только если переиспользуете порядок; берите stable-сортировку (merge, insertion), когда равные элементы должны сохранять место; меняйте O(n) буфер merge sort на in-place O(log n) стек quicksort, когда памяти мало, и помните, что плохие pivot грозят O(n²), если не рандомизировать. Когда порядок есть, binary search находит ответы за O(log n) — но только при корректном включающем инварианте, и обобщается на любой монотонный предикат, а не только на массивы.