#arrays #sorting #pivot #quicksort
#массивы #сортировка #сводная #быстрая сортировка
Вопрос:
Отсортируйте следующий массив a с помощью быстрой сортировки,
[6, 11, 4, 9, 8, 2, 5, 8, 13, 7]
Сводная таблица должна быть выбрана как среднее арифметическое первого и последнего элемента, т.е. (a[0] a[size - 1]) / 2 (rounded down)
.
Покажите все важные шаги, такие как разбиение на разделы и рекурсивные вызовы алгоритма.
Я понимаю, как отсортировать массив с помощью быстрой сортировки, однако я не уверен, как вычислить сводную таблицу.
Рассчитывается ли сводная таблица 6 7 = 13
тогда 13 / 2 = 6.5
(округлено в меньшую сторону 6
), так что сводная таблица является 2
(т. Е. 6-м элементом)?
Я знаю, что элементы, меньшие, чем сводная таблица, отображаются с левой стороны, а элементы, большие, чем сводная таблица, отображаются с правой стороны, и раздел повторяет этот шаг сортировки подмассива.
Любая помощь была бы высоко оценена.
Ответ №1:
Для быстрой сортировки сводной системой может быть любой элемент, который вы хотите. Загляните в Википедию.
Проблема была легко решена путем выбора либо случайного индекса для сводной системы, выбора среднего индекса раздела или (особенно для более длинных разделов) выбора медианы первого, среднего и последнего элемента раздела для сводной системы
Таким образом, три варианта :
- Первый элемент
- Средний элемент
- Медиана первого, среднего и последнего.
И в вашем случае использование среднего значения первого и последнего элемента дало бы вам :
6 7 = 13
13 / 2 = 6.5
6.5 rounded down = 6
Комментарии:
1. Я думаю, что это неправильно, но ошибка была в исходном вопросе. Вы исправили их, затем выполнили неверный расчет, о котором они просили, когда взяли среднее значение (первое, последнее). Вам нужна медиана (первая, средняя, последняя). Хотя хороший момент о том, как инструктор пропустил одну из лучших стратегий выбора точки разворота (случайную).
Ответ №2:
Для данного массива [6, 11, 4, 9, 8, 2, 5, 8, 13, 7]
Вычислите что-то вроде этого:
-
Выберите первый элемент, который
6
-
Выберите последний элемент списка, который
7
-
Выберите средний элемент, который является
mid = (length%2==0) ? (length/2)-1 : (length-1)/2
, который является8
-
Это создает массив и сортирует его так, как это будет
[6,7,8]
, теперь средний элемент в вашем массиве — медиана.
Комментарии:
1. Вау, это вопрос 8-летней давности, на который до сих пор не было хороших ответов. Я проголосовал за вас, но ваше объяснение довольно скудное.
Ответ №3:
Кстати, вопрос сформулирован так, что сводная таблица должна быть просто 6 и не обязательно 6-м элементом в массиве.
Это наиболее определенно так, потому что, например, если бы в массиве было только 3 элемента, а среднее арифметическое оказалось бы больше 3, вам не пришлось бы выбирать сводную систему, потому что нет элемента с таким индексом.
Примечание: Будьте осторожны с тем, как вы индексируете элементы в своем массиве. Вы сказали, что 6-й элемент равен «2», хотя он может быть «5», если ваш язык программирования запускает индексы с 0.
Ответ №4:
Ваша сводная таблица равна 6. Ваша сводная таблица НЕ является 6-м элементом, теперь вы можете применить следующий алгоритм.
function quicksort(array)
var list less, greater
if length(array) ≤ 1
return array // an array of zero or one elements is already sorted
select and remove a pivot value pivot from array
for each x in array
if x ≤ pivot then append x to less
else append x to greater
return concatenate(quicksort(less), pivot, quicksort(greater))
Ответ №5:
Позиция сводной системы из этого вычисления не важна, быстрая сортировка сортирует элементы на основе того, больше они или меньше, чем сводная система. Затем сводная таблица помещается между двумя наборами (больше и меньше).
Комментарии:
1. Возможно ли, чтобы элемент pivot отсутствовал в массиве?