Я пытаюсь понять, как выбрать точку опоры при поиске повторяющихся ключей в массиве. Большинство примеров, которые я видел, всегда выбирали первый элемент в качестве точки поворота, делая вид, что этот элемент дублируется в массиве. Что, если это не так? Как правильно выбрать ось?
Предположим, что массив a[lo...hi]
и v элемент разделения, v = a[lo]
. У нас также есть еще 2 индекса gt и lt, где
a[lo ... lt]
меньше va[lt ... gt]
равны va[gt ... hi]
больше v
Идея состоит в том, чтобы сканировать слева направо, пока i> gt:
(a[i] < v)
:swap(a[i], a[lt]), i++, lt++
(a[i] > v) : swap(a[i], a[gt]); gt--
(a[i] == v): i++
Идея очень похожа на разделение с быстрой сортировкой, и я хотел бы знать, как правильно выбрать опорную точку в этом случае.