Уточнить критерии обмена в быстрой сортировке?
В быстрой сортировке идея состоит в том, чтобы вы продолжали выбирать опору. И вы меняете значение, которое вы найдете слева, которое больше, чем пивот, на значение, которое вы найдете справа, которое меньше, чем шарнир. смотри: ref
Просто хочу быть на 100% уверенным в том, что происходит в следующих случаях:
- Нет значения слева больше, чем шарнир, значение справа меньше, чем шарнир
- Значение слева больше, чем шарнир, нет значения справа меньше, чем шарнир
- Нет значения слева больше, чем шарнир, нет значения справа меньше, чем шарнир
2 ответа
Критерии обмена зависят от реализации. То, что происходит в трех упомянутых вами случаях, зависит от схемы разбиения. Существует множество реализаций Quicksort, но две наиболее известные из них (на мой взгляд):
Раздел Хоара: первый элемент - это стержень и две индексные переменные (
i
а такжеj
) пройти массив (a[]
) к центру, в то время как элементы, с которыми они сталкиваются, меньше / больше, чем точка поворота. затемa[j]
а такжеa[i]
поменялись местами. Обратите внимание, что в этой реализации своп происходит для элементов, которые равны стержню. Это считается важным, когда ваш массив содержит много одинаковых записей. Послеi
а такжеj
пересекать,a[0]
поменялся местами сa[j]
Таким образом, стержень находится между разделом с меньшим или равным разделом и разделом с большим или равным значением.Раздел Ломуто. Это тот, который реализован в псевдокоде в текущей записи быстрой сортировки Wiki в разделе " Версия на месте". Здесь пивот может быть чем угодно (скажем, медиана или медиана трех) и поменяется местами с последним элементом
a
, Здесь толькоi
"идет" к концу массива: всякий раз, когдаa[i]>=pivot
он поменялся сa[j]
а такжеj
уменьшается. В конце, пивот меняется наa[i+1]
(Смотрите здесь, например, для иллюстрации).
Роберт Седжвик представляет трехстороннюю схему разбиения, где массив делится на три раздела: меньше, равно и больше, чем сводная точка: утверждается, что он имеет лучшую производительность для массивов с большим количеством дупликов или идентичных значений. Это реализовано еще по-другому (см. Ссылку выше).
В то время как выбор значения поворота важен для производительности, он не важен для сортировки.
После того, как вы выбрали какое-либо значение в качестве точки поворота, вы перемещаете все значения, меньшие или равные точке поворота, влево от точки поворота, а справа от нее вы получаете все значения, превышающие эту точку поворота.
После всех этих движений значение разворота находится в своей окончательной позиции.
Затем вы рекурсивно повторите вышеописанную процедуру для подмассива слева от значения pivot, а также для подмассива справа от него. Или, конечно, если подмассивы содержат 0 или 1 элемент, они не имеют ничего общего с сортировкой.
Таким образом, в итоге вы выбираете кучу значений разворота, которые после всех ходов попадают в свои конечные позиции. Между этими сводными значениями находятся пустые или одноэлементные подмассивы, которые не нуждаются в сортировке, как описано ранее.