Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
118
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

3.6. Сортировка методом индексов

Идея этого метода состоит в том, что каждый элемент массива A, такого, что все его элементы это целые, положительные, несовпадающие числа, записывается в ячейку другого пустого массива. Номер ячейки, в которую помещается элемент, соответствует числовому значению элемента. То есть элемент с числовым значением 3 из первого массива вписывается в третью ячейку второго массива, 11 – в одиннадцатую и т.д.

Схема сортировки следующая:

Дан массив A = {ai | aiaj ij, i=1N, j=1N}.

  1. Сначала ищем максимум в массиве А. Такую же размерность будет иметь вспомогательный массив В.

  2. Объявление вспомогательного массива B [1..Max(A)] и обнуление его элементов.

  3. Вписываем элементы массива А в ячейки массива В по вышеприведенному принципу.

  4. Восстановление массива А из массива В путем удаления нулей.

IndexSort (A, N)

Max  Maxim (A, N) // поиск максимума

for j=1 to Max

B[j]0

endfor

for i=1 to N do

B[A[i]]A[i]

endfor

k1

For j=1 to Max

if B[j]  0 then

A [k]  j

k k+1

endif

endfor

end

Так же, как и в предыдущем случае, функция трудоемкости данного алгоритма линейна, то есть fА(N, Max)=10Max+15N. И так же требуется существенный дополнительный объем памяти для вспомогательного массива В.

Пример 3.5. Сортировка индексами. Исходный список (3,5,1,11,8).

Максимальный элемент списка – 11. Значит, размерность дополнительного массива –11. Заполняем его значениями из списка А:

1

2

3

4

5

6

7

8

9

10

11

индекс В

1

0

3

0

5

0

0

8

0

0

11

значение B(j)

Обратная сборка ненулевых элементов из В в А дает отсортированный список (1,3,5,8,11).

Задание. Как можно модифицировать алгоритм для случая, когда в массиве имеются отрицательные целые элементы? повторяющиеся значения?

3.7. Быстрая сортировка (алгоритм Хоара)

Этот метод был разработан в 1962 г. Чарльзом Ричардом Хоаром.

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

Если i - окончательное положение осевого элемента, то нам известно лишь, что все значения от 1 до (i – 1) меньше осевого, а значение с номерами (i + 1) до N – больше осевого.

Затем алгоритм QSort вызывается рекурсивно на каждой из двух частей. При вызове процедуры QSort на списке, состоящем из одного элемента, он ничего не делает, поскольку одноэлементный список уже отсортирован.

Анализ наихудшего случая

В наилучшем случае быстрая сортировка при разделении списка дает 2 части одинакового размера. Число шагов (log2N) и на каждом шаге выполняется N сравнений.

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

В этом случае в одном из списков нет ни одного элемента, а в другом - (N – 1). Если такая ситуация возникает при всяком рекуррентном вызове, то всякий раз будет происхо­дить удаление одного элемента, следовательно число сравнений

Такой порядок бывает в уже отсортированных списках. Наихудший случай бывает для уже упорядоченного списка.

Таким образом, в лучшем случае трудоемкость такой сортировки fА (N)= O(N log2N), в наихудшем случае ее эффективность такая же, как у сортировки вставками и пузырьковой fА (N)=О(N2).

Qsort (A, first, last)

// A - сортируемый список

// first - номер 1 –го элемента в сортируемой части

// last - номер последнего элемента в сортируемой части

if first < last then

// Функция OS определяет положение осевого элемента в списке

// и переупорядочивает список по указанному принципу.

i  OS (A, first, last)

Qsort (A, first, i – 1)

Qsort (A, i + 1, last)

endif

end

Детальный анализ [1] показывает, что в среднем случае асимптотическая оценка O(N log2N) остается в силе, однако коэффициент у главного порядка функции трудоемкости будет больше, чем в лучшем случае.