Выше по иерархии
Другие алгоритмы.

Алгоритмы сортировки.


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

     Назовем пирамидой последовательность элементов

hl , hl+1 , ... , hr

такую, что
hi <= h2i

hi <= h2i+1

для всякого i = l , ... , r/2

     Геометрическая интерпретация пиромиды:
                 h1
                /  \
               /    \
              /      \
             /        \
            /          \
          h2            h3
         / \            / \
        /   \          /   \
      h4    h5       h6     h7
     /	\  /  \     / \   /  \
    h8  h9 h10 h11  h12 h13 h14 h15

 Для последовательности 06 42 12 55 94 18 44

                 06
                /  \
               /    \
              /      \
             /        \
            /          \
          42            12
         / \            / \
        /   \          /   \
      55    94        18   44

Добавление элемента в готовую пирамиду.

     1. Новый элемент Х помещаем в вершину дерева.

     2. Смотрим на элемент слева и элемент справа - выбираем наименьший.

     3. Если этот элемент меньше Х - меняем их местами и идем у шагу 2. Иначе конец процедуры.

Фаза 1: построение пирамиды.

     Пусть дан массив h1 ... hn . Ясно, что элементы hn/2 + 1 ... hn уже образуют 'нижний ряд' пирамиды, так как не существует индексов i , j : j = 2*i ( или j = 2*i + 1 ). То есть тут упорядочивания не требуется.

     На каждом шаге добавляется новый элемент слева и 'просеивается' на место. Вот иллюстрация процесса для пирамиды из 8-и элементов:
44  55  12  42  //  94  18  06  67
44  55  12  //  42  94  18  06  67
44  55  //  06  42  94  18  12  67
44  //  42  06  55  94  18  12  67
//  06  42  12  55  94  18  44  67

Фаза 2: сортировка.

     Для того, чтобы рассортировать элементы, необходимо выполнить n шагов просеивания: после каждого шага очередной элемент берется с вершины пирамиды. На каждом шаге берем последний элемент Х, верхний элемент пирамиды помещается на его место, а Х просеивается на свое 'законное'. В этом случае необходимо совершить n - 1 шагов. Пример:

 06  42  12  55  94  18  44  67  //
 12  42  18  55  94  67  44  //  06
 18  42  44  55  94  67  //  12  06
 42  55  44  67  94  //  18  12  06
 44  55  94  67  //  42  18  12  06
 55  67  94  //  44  42  18  12  06
 67  94  //  55  44  42  18  12  06
 94  //  67  55  44  42  18  12  06
 
     Ну вот мы м получили отсортированную последовательность, только в обратном порядке. Изменяя сравнения на противоположные, получаем функцию Heapsort на Паскале

     Прекрасной характеристикой этого метода является то, что среднее число пересылок - (n*log n)/2 и отклонения от этого значения сравнительно малы.


Вверх по странице, к оглавлению и навигации.