50 Глава 1. Алгоритмы и их сложность
Рис. 1.5. Работа «Quicksort» с разными методами выбора оси
Sorting (pivotFunc=pivotTrivial): [3, 1, 4, 5, 2, 6, 3, 7]
QSortInterval: [3, 1, 4, 5, 2, 6, 3, 7] *3*-> [1, 2] [3, 3] [6, 5, 7, 4]
QSortInterval: [1, 2] *1*-> [] [1] [2]
QSortInterval: [6, 5, 7, 4] *6*-> [5, 4] [6] [7]
QSortInterval: [5, 4] *5*-> [4] [5] []
Sorted: [1, 2, 3, 3, 4, 5, 6, 7]
Плохой набор для выбора осью первого элемента.
Sorting (pivotFunc=pivotTrivial): [1, 6, 2, 5, 3, 7, 4]
QSortInterval: [1, 6, 2, 5, 3, 7, 4] *1*-> [] [1] [2, 5, 3, 7, 4, 6]
QSortInterval: [2, 5, 3, 7, 4, 6] *2*-> [] [2] [3, 7, 4, 6, 5]
QSortInterval: [3, 7, 4, 6, 5] *3*-> [] [3] [4, 6, 5, 7]
QSortInterval: [4, 6, 5, 7] *4*-> [] [4] [5, 7, 6]
QSortInterval: [5, 7, 6] *5*-> [] [5] [6, 7]
QSortInterval: [6, 7] *6*-> [] [6] [7]
Sorted: [1, 2, 3, 4, 5, 6, 7]
Эффективно сортируется вероятностной осью.
Sorting (pivotFunc=pivotRandom): [1, 2, 3, 4, 5, 6, 7]
QSortInterval: [1, 2, 3, 4, 5, 6, 7] *6*-> [1, 2, 3, 4, 5] [6] [7]
QSortInterval: [1, 2, 3, 4, 5] *2*-> [1] [2] [4, 5, 3]
QSortInterval: [4, 5, 3] *4*-> [3] [4] [5]
Sorted: [1, 2, 3, 4, 5, 6, 7]
осевой элемент, и алгоритм 12 «Quicksort» на «плохих» вход-
ных данных выполняет Ω(N) рекурсий, а общее количество
операций (с учетом операций в процедуре «partition») будет
Ω(
P
N
i=1
i) = Ω(n
2
).
Упражнение 1.1.9. Сколько памяти может использовать ал-
горитм 12 «Quicksort» в наихудшем случае?
Осталось выяснить, часто ли встречаются наихудшие (для
«pivotTrivial») случаи на множестве входных данных.
Допустим, входные данные случайны, и их распределение
таково, что в каждом интервале длины N, встречающемся
в процедуре «partition», первый элемент с равной вероятно-
стью может быть k-м (1 ≤ k ≤ N) по величине, «разбивая» тем