Алгоритмы быстрой сортировки. Много разных способов сделать одно и то же?

Правильно ли я говорю, что существует много способов выполнить быструю сортировку?

Для аргументации давайте использовать номера первого учебника: 20 47 12 53 32 84 85 96 45 18

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

В основном он продолжает перемещать синий указатель, пока числа не станут: 18 12 20 53 32 84 85 96 45 47

Теперь он говорит (и это очевидно для меня), что все числа слева от 20 меньше, а все числа справа больше, но никогда не называет 20 «осью», т.е. как большинство других ресурсов говорят об этом. Затем, как указано во всех других методах, он выполняет быструю сортировку с двух сторон, а затем мы получаем (это касается только сортировки правой половины списка):

47 32 45 53 96 85 84 и книга заканчивается. Теперь я знаю из других ресурсов, что как только все списки приведены в порядок, они снова собираются вместе. Думаю, я понимаю это, но меня постоянно смущает один учебник, одобренный Кембриджем, который отличается от второго. Второй говорит о поиске точки разворота путем выбора медианы.

Как лучше всего найти «стержень» для списка?


person Chris    schedule 16.04.2015    source источник
comment
Предложенный вами тег не подходит для этого сайта. Дополнительную информацию о тегах см. здесь: stackoverflow.com/help/tagging   -  person BJ Myers    schedule 16.04.2015
comment
Это мнение одного человека. Нам, учителям старших классов, постоянно не хватает ресурсов, или нам приходится искать в Интернете слишком много ресурсов. Мы учим студентов, как программировать в отрасли, которая требует больше людей с ИТ-подготовкой. Может быть, Кембридж - неправильный тег, как насчет учителей средней школы или учителей средней школы?   -  person Chris    schedule 16.04.2015
comment
Если вам нужно больше мнений, включая людей, которые управляют этим сайтом, посмотрите на Meta. Это где-то там. И стандартный вопрос для этого случая: может ли кто-то быть экспертом, знающим все о школьных учителях? Нет? Тогда он не получит тег. Возможны специалисты по алгоритмам сортировки и т.п., но не учителя. Это не было бы полезно. Никого не волнует, если вы спрашиваете, потому что вы преподаватель Кембриджа, людей волнует только вопрос. И никто не будет искать вопросы, заданные учителями, а вопросы о напр. Быстрая сортировка.   -  person deviantfan    schedule 16.04.2015
comment
Страница, на которую я ссылаюсь о тегах, указывает, что теги должны описывать содержание вопроса. Если тег не может работать как единственный тег в вопросе, его не следует использовать. Подробнее здесь   -  person BJ Myers    schedule 16.04.2015


Ответы (2)


То, что дается в вашем учебнике, похоже на концепцию, основанную на повороте, за исключением того, что они не упоминают эту терминологию там. Но в любом случае понятия одинаковые.

Как лучше всего найти «стержень» для списка?

Не существует фиксированного способа выбора основного элемента. Вы можете выбрать любой элемент массива --- первый, второй, последний и т.д. Он также может быть выбран случайным образом для данного массива.

Но ученые и математики обычно говорят о срединном элементе, который является средним элементом списка по причине, основанной на симметрии, тем самым уменьшая рекурсивные вызовы.

Почти очевидно, что когда вы выберете первый или последний элемент массива, количество рекурсивных вызовов будет больше --- тем самым приближаясь к наихудшему сценарию. Большее количество рекурсивных вызовов будет создано для раздельного выполнения быстрой сортировки в двух разделах.

person Am_I_Helpful    schedule 16.04.2015
comment
Спасибо, и если бы у меня было достаточно баллов, я бы оценил ваш ответ как полезный! - person Chris; 16.04.2015
comment
@ Крис-Спасибо за высокую оценку. Кроме того, вы можете проголосовать за мой ответ позже, когда вы наберете 15 репутации, сейчас у вас 8. - person Am_I_Helpful; 16.04.2015

Теоретически выбор медианного элемента в качестве опорного гарантирует наименьшее количество рекурсивных звонков и гарантирует Theta(nlogn) время работы.
Однако нахождение этой медианы осуществляется с помощью алгоритма выбора, и если вы хотите гарантировать выбор занимает линейное время - ему нужен алгоритм медианы медиан, который имеет плохие константы.

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

Хорошее надежное решение для выбора опорной точки — наугад. Нарисуйте случайное число из r = rand([0,length(array)) и выберите r-й элемент в качестве опорного.

Хотя здесь есть теоретическая возможность для худшего случая - это:

  1. Очень маловероятно
  2. Злонамеренному пользователю трудно предсказать, какой вход будет наихудшим, особенно если случайная функция и/или начальное число ему неизвестны.
person amit    schedule 16.04.2015