#sorting #quicksort
#сортировка #быстрая сортировка
Вопрос:
Это обсуждалось во многих местах, по-моему, много раз, но я искал уже 3 дня и не понимал, как это происходит. Мой вопрос:
Где находится второй указатель, если мы возьмем первый или последний элемент в качестве точки поворота?
Что я буквально имею в виду:
Случай 1
Центральный элемент массива в качестве стержня
Это все понятно, поскольку 5 находится в центре, мы идем дальше и находим элементы, соответствующие условиям:
1.) элемент < pivot для левой стороны, если найден, мы останавливаем указатель
2.) элемент> поворот для правой стороны, если найден, мы останавливаем указатель
3.) поменяйте местами элементы, на которых мы остановили указатели во время шагов 1 и 2
Случай 2: (неясный)
первый или последний элемент в качестве стержня
Здесь неясно, куда я должен поместить оба указателя, чтобы начать поиск элементов, и в каком направлении относительно поворота я должен двигаться? Должно ли это быть также двумя указателями и как их следует перемещать? Все еще должно быть всего два указателя?
Ответ №1:
Если используются два указателя, это некоторая вариация схемы разбиения Хоара, где указатели начинаются с первого и последнего элемента массива и продвигаются друг к другу при сканировании на наличие «неуместных» элементов. Если в качестве pivot выбран первый или последний элемент, первая замена будет включать pivot.
Обратите внимание, что алгоритм Хоара обычно включает pivot в один из разделов. Это создает проблему при использовании первого или последнего элемента в качестве сводного, поскольку шаблоны данных, такие как уже отсортированные данные, приведут к переполнению стека, поскольку разделение всегда будет состоять из 0 элементов и n элементов. Чтобы решить эту проблему, алгоритму необходимо исключить pivot в рекурсивных вызовах.
Комментарии:
1. Таким образом, на самом деле не имеет значения, есть у нас указатель или нет tnen? Я видел несколько примеров, где последний элемент был взят как pivot, и идея состояла в том, чтобы сравнить каждый элемент перед pivot с pivot и перемещать только более крупные элементы за pivot (в этот момент pivot в конечном итоге будет посередине), мне не показалось, что в этих примерах вообще было 2 указателя, только один перемещался слева направо.
2. @MarkusMeier — Один указатель будет вариантом Lomuto . Два указателя были бы разновидностью Hoare . Hoare обычно быстрее, чем Lomuto. Я обновил свой ответ, чтобы прояснить второй абзац.