Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных.doc
Скачиваний:
172
Добавлен:
11.03.2015
Размер:
2.05 Mб
Скачать
      1. 1. Выбираем элемент массива в качестве разделителя (например, первый).

      2. 2. Располагаем элементы, не большие разделителя, в левом подмассиве, а не меньшие — в правом подмассиве.

      3. 3. Если число элементов в левом подмассиве больше 1, то применяем к нему алгоритм в целом, иначе конец алгоритма.

      4. 4. Если число элементов в правом подмассиве больше 1, то применяем к нему алгоритм в целом, иначе конец алгоритма.

      5. Пункт 2 алгоритма выполняется следующим образом. Просматриваем массив слева и находим элемент, не больший разделителя. Затем просматриваем массив справа и находим элемент, не меньший разделителя. Выполняем обмен найденных элементов. Просмотр заканчивается, когда индекс первого найденного элемента превысит индекс второго найденного элемента. В результате получаем левый и правый подмассивы.

  1. Пример.

  2. Исходный массив (30 10 40 20 15 17 45 60)

Разделитель 30

После выполнения п.2 получаем следующие два подмассива:

      1. (17 10 15 20) (40 30 45 60)

      2. И так далее, пока выполнится условие окончания алгоритма, т.е. когда все подмассивы будут содержать по одному элементу.

      3. Анализ сортировки Хоара

Пусть m = log 2 N, где N — количество элементов. Будем считать, что количество элементов, меньших разделителя, равно количеству элементов, больших разделителя, т.е. массив разбивается пополам на две равные части. Определим количество сравнений в этом случае:

N + 2·(N / 2) + … + m·(N / m) = O(N·m) = O(N·log2N).

Если каждый раз одна из частей массива содержит не более одного элемента, то порядок будет O(N2).

Характер разбиения массива, а, следовательно, и порядок функции ВС, зависит от соотношения разделителя и остальных элементов массива. Для определения «хорошего» разделителя имеются различные алгоритмы.

Пирамидальная сортировка

Пирамидальная сортировка является улучшенной сортировкой выбором. Из массива, состоящего из N элементов, выбирается максимальный и меняется местами с последним. Затем рассмат-ривается массив из N = N – 1 элементов. Процесс повторяется до тех пор, пока количество рассматриваемых элементов больше одного. Пира-мидальная сортировка отличается от сортировки выбором поиском максимального элемента. Чтобы понять пирамидальную сортировку, массив нужно интерпретировать как бинарное дерево, в корне которого находится первый элемент массива, на втором уровне — второй и третий, на третьем — с четвертого по седьмой и т.д. Для i-го элемента массива можно определить номер P элемента, являющегося родителем, как P = i div 2; номер L элемента, являющегося левым сыном, как L = 2·i; номер R элемента, являющегося правым сыном, как R=2·i+1. Если в массиве (в дереве) N элементов, то последний элемент, имеющий хотя бы одного левого сына, имеет номер (N div 2). Массив M (см. таблицу 10) можно представить деревом на рис.5.

Таблица 10

Массив м

номер элемента массиваМ

1

2

3

4

5

6

7

8

9

10

значение элемента массива М

42

5

87

1

74

12

63

25

58

33

1

2 3

4 5 6 7

8 9 10

Рис. 5. Представление массива в виде дерева

Поиск максимального элемента массива в этом алгоритме основан на понятии пирамиды. Дерево (поддерево) является пирамидой, если каждый элемент в нем больше или равен элементам, которые являются его сыновьями. Корень пирамиды — максимальный элемент массива. Пирамида для массива M (см. таблицу 10) представлена на рис. 6.

Рис.6. Пирамида для массива М

Построив пирамиду для массива, можно, в соответствии с алгоритмом сортировки вставками, максимальный элемент, который находится в корне пирамиды (корень пирамиды — первый элемент массива), поменять местами с последним элементом массива. В результате получим массив М (см. таблицу 11) и его представление без последнего элемента в виде дерева на рис.7.

Таблица 11