Можете ли вы выбрать любую точку поворота в быстрой сортировке?

Недавно я увидел Quick Sort - Computerphile видео на Youtube о том, как работает быстрая сортировка (на бумаге), и у меня есть вопрос. Представьте, что у нас есть массив, содержащий, например, "27,6,19,2,15,9,10". Сначала я выбираю 10 в качестве точки поворота, и массив становится таким: 9,2,6 |10| 27,19,15. Затем я выбираю 6 в качестве точки поворота для левого несортированного массива, и он становится 2 |6| 9, а для правого я выбираю 19 в качестве точки поворота, а правый несортированный массив становится 15 |19| 27. Вопрос в следующем: могу ли я выбрать любую точку поворота, чтобы облегчить мою работу (как я сделал в этом примере), или есть что-то еще?

Изменить: если бы я выбрал 27 в качестве точки поворота вместо 19, каким был бы массив?


person lor    schedule 09.08.2016    source источник


Ответы (3)


Вы можете выбрать любое значение, при котором ни одна часть раздела не будет пустой, то есть не меньше наименьшего и не больше наибольшего. (Значение не обязательно должно быть одним из элементов массива.)

Чем более сбалансировано разделение (т.е. чем ближе к медиане), тем лучше. Хотя это никогда не делается, среднее арифметическое подойдет.

Распространенной стратегией является медиана трех (первого, центрального и последнего элементов).

person Yves Daoust    schedule 09.08.2016
comment
Я обновил вопрос о последней части, которую вы говорите. Взгляни, пожалуйста. - person lor; 09.08.2016
comment
@lor: Я не вижу связи между вашим изменением и моим последним предложением. - person Yves Daoust; 09.08.2016
comment
Виноват. Я набрал последний вместо первого. Я должен указать, что если мы выберем точку поворота, отличную от той, которую выбрал я, например, 2 вместо 6 и 27 вместо 19, какая будет разница? Подмассив будет выглядеть как | 2 | 6 9 и 15 19 | 27 | или у нас было бы здесь что-то еще? - person lor; 09.08.2016
comment
@lor Что еще это могло быть? - person Yves Daoust; 09.08.2016
comment
Я прав. Просто не могу сказать это правильно. Вот пример. Во-первых, что мы выбрали 10 в качестве точки поворота, имеет значение только расположение элементов, меньших, чем точка поворота, влево и большего, чем точка поворота, вправо, не обращая внимания на то, как они размещены, или мы начинаем слева направо и помещаем элементы в они правая сторона? Например, если я выбрал 2 для первого несортированного массива, мне следует написать | 2 | 9 6 и сделайте еще один проход или я должен написать | 2 | 6 9 прямо? - person lor; 09.08.2016
comment
Спасибо, это очень помогло. i.e. not smaller than the smallest nor larger than the largest - person parsecer; 03.12.2020

В принципе, вы можете взять любой элемент массива в качестве стержня; алгоритм будет работать. На практике, если вы выберете самый маленький или самый большой элемент массива в качестве точки поворота, один проход алгоритма быстрой сортировки даст очень мало результатов. Скажем, у вас есть числа от 1 до 100 в случайном порядке и вы выбрали 1 в качестве точки поворота, тогда у вас все равно останется массив с 99 элементами для сортировки. Худший возможный случай - это выбор первого элемента массива в качестве опорного, если массив уже отсортирован.

person gnasher729    schedule 09.08.2016

Взгляните на этот вопрос и ответ.

Существует обсуждение, показывающее, что выбор случайной точки поворота, вероятно, является лучшим выбором в большинстве сценариев.

person marcelovca90    schedule 09.08.2016
comment
Случайный поворот - действительно хороший выбор. В любом случае, его следует использовать только в версиях, которые переключаются на альтернативный алгоритм для коротких подмассивов. В противном случае затраты на генерацию случайных чисел могут стать значительными накладными расходами. - person Yves Daoust; 09.08.2016
comment
Я видел вопрос. В этом простом сценарии с массивом из 7 элементов моя техника хороша или нет? Я обновил вопрос последним вопросом. Взгляни, пожалуйста. - person lor; 09.08.2016
comment
@YvesDaoust подойдет дешёвый псевдослучайный. Возможно, вы могли бы просто использовать count++ % array.length - person Bohemian♦; 09.08.2016
comment
Оператор% не из дешевых. - person Yves Daoust; 09.08.2016