8.4. Пирамидальная сортировка
Алгоритм пирамидальной сортировки предложен Уильямсом и развит Флойдом. Алгоритм основан на бинарном дереве, не требует дополнительной памяти и имеет трудоемкость O(n log2 n).
Пусть задан массив . (1)
Пирамидой называется непустая последовательность элементов (1) вида
, (2)
для которой выполнено одно из условий .
Из определения вытекают следующие утверждения.
1). Для любой последовательности (1) последовательность является пирамидой.
2). Если последовательность (1) – пирамида, то выполняется условие . (3)
3). Если последовательность (1) – пирамида и представлена в виде бинарного дерева, то значение любого узла в нем будет не меньше значений его левого и правого потомков.
П ример 1. Последовательность чисел:
90 70 11 8 3 9 7 5 6 1 2
является пирамидой. Наглядно это видно из рисунка.
Алгоритм реализуется в два этапа.
Этап 1. Построение пирамиды
Имеем последовательность , являющейся пирамидой. Нарастим ее слева элементом . Тогда получим последовательность , (4)
которую снова преобразуем в пирамиду. Для этого "просеем" по соответствующей веточке двоичного представления (1). Для этого рассмотрим и два его потомка и . Если не меньше потомков, то вычисления прекращаем, так как (4) уже пирамида, в противном случае обмениваем значения и в соответствующих позициях дерева, а "опустившийся" элемент продолжаем просеивать тем же способом, пока (4) не станет пирамидой. Продолжаем наращивать последовательность (4) пока последовательность (1) не станет пирамидой. При этом будет выполнено условие (3). Построенная пирамида объявляется S-текущей.
Этап 2. Сортировка пирамиды
В S-текущей пирамиде первый элемент не меньше остальных. Обменяем значениями концевые элементы массива S и укоротим его справа на 1. Полученная последовательность может и не быть пирамидой. Применяя к ней процесс "просеивания" для элемента , описанный выше, преобразуем последовательность в пирамиду. Повторяя этап (n-1) раз, отсортируем массив S по не возрастанию.
Этап 1. Построение пирамиды | Этап 2. Сортировка пирамиды | ||||||||||||||
23 | 77 | 12 | 7 | 44 | 82 | 16 | 53 | 7 | 77 | 23 | 53 | 44 | 12 | 16 | 82 |
23 | 77 | 12 | 53 | 44 | 82 | 16 | 7 | 16 | 53 | 23 | 7 | 44 | 12 | 77 | 82 |
23 | 77 | 82 | 53 | 44 | 12 | 16 | 7 | 12 | 44 | 23 | 7 | 16 | 53 | 77 | 82 |
23 | 77 | 82 | 53 | 44 | 12 | 16 | 7 | 12 | 16 | 23 | 7 | 44 | 53 | 77 | 82 |
82 | 77 | 23 | 53 | 44 | 12 | 16 | 7 | 7 | 16 | 12 | 23 | 44 | 53 | 77 | 82 |
|
|
|
|
|
|
|
| 12 | 7 | 16 | 23 | 44 | 53 | 77 | 82 |
|
|
|
|
|
|
|
| 7 | 12 | 16 | 23 | 44 | 53 | 77 | 82 |
А Dim S() As Integer Const n As Integer = 8 Sub Пирамидальная_сортировка() 'Отладочный вариант Dim j As Integer, m As Integer, k As Integer, var As String ReDim S (1 To n): S(1)=23: S(2)=77: S(3)=12: S(4)=7: S(5)=44: S(6)=82: S(7)=16: S(8)=53 'For j = 1 To n: S(j) = Int(Rnd(Time)*100: Next j k = n: var = "Исходные:": For j = 1 To n: var = var & " " & Str(S(j)): Next j: MsgBox var For j = n\2 To 1 Step -1 var = "Пирамида:": For m = 1 To n: var = var & " " & Str(S(m)): Next m: MsgBox var просеивание j, k Next j For k = n - 1 To 1 Step -1: m = S(1): S(1) = S(k+1): S(k+1) = m var = "Сортировка:": For j = 1 To n: var = var & " " & Str(S(j)): Next j: MsgBox var просеивание 1, k Next k var = "Отсортированные:": For j = 1 To n: var = var & " " & Str(S(j)): Next j: MsgBox var End Sub Sub просеивание(x As Integer, k As Integer) Dim m As Integer, y As Integer 1: y = x + x If y > k Then Exit Sub If y = k Then GoTo 2 If S(y) < S(y + 1) Then y = y + 1 ' > - по не возрастанию 2: If S(x) >=S(y) Then Exit Sub '<= - по не возрастанию m = S(x): S(x) = S(y): S(y) = m: x = y: GoTo 1 End Sub
- Введение в программирование и основы алгоритмизации
- 1.2. Понятие "правильной" программы
- 1.3. Надежность программного средства
- 1.4. Технология программирования как разработка надежных пс
- 1.5. Информатизация общества
- Тема 2 источники ошибок в программных средствах
- 2.1. Интеллектуальные возможности человека
- 2.2. Неправильный перевод как причина ошибок в пс
- 2.3. Модель перевода
- На каждом из этих шагов человек может совершить ошибку разной природы.
- 2.4. Основные пути борьбы с ошибками
- Тема 3 общие принципы разработки программных средств
- 3.1. Специфика разработки пс
- 3.2. Жизненный цикл пс
- 3.3. Понятие качества пс
- 3.4. Внешнего описания и его роль в обеспечении качества пс
- 3.5. Обеспечение надежности – основной мотив разработки пс
- 3.5. Борьба со сложностью систем и обеспечение точности перевода
- Тема 4 разработка структуры программы. Модульное и объектно-ориентированное программирование
- 4.1. Цель модульного программирования
- 4.2. Основные характеристики программного модуля
- 4.3. Методы разработки структуры программы
- 4.4. Объектно-ориентированное программирование
- 4.5. События и событийная модель
- Тема 5 Алгоритмизация и разработка программного модуля
- 5.1. Определение алгоритма
- Алгоритмизация - техника составления алгоритмов и программ для решения задач на эвм.
- 5.2. Изобразительные средства описания алгоритмов
- 5.3. Блок-схемы алгоритмов. Графические символы
- 5.4. Порядок разработки программного модуля
- 5.5. Структурное программирование
- 5.6. Пошаговая детализация и понятие о псевдокоде
- Тема 6 тестирование и отладка программного средства
- 6.1. Основные понятия
- 6.2. Принципы и виды отладки пс
- 6.3. Заповеди отладки пс
- 6.4. Автономная отладка пс
- Тема 7 Методы разработки алгоритмов
- 7.1. Метод частных целей
- 7.2. Метод подъема
- 7.3. Программирование с отходом назад
- Тема 8 Алгоритмы сортировки
- 8.1. Сортировка. Основные понятия
- 8.2. Пузырьковая сортировка
- 8.3. Сортировка с помощью дерева
- 8.4. Пирамидальная сортировка
- 8.5. Быстрая сортировка
- Тема 9 Алгоритмы поиска и перебора
- 9.1. Поиск. Основные понятия
- 9.2. Бинарный поиск
- 9.3. Поиск в сети
- Тема 10 Событийно-управляемое программирование на языке Visual Basic
- 10.1. Историческая справка
- 10.2. Основы Visual Basic
- Среда Windows: окна, события, сообщения
- Интерактивная разработка
- Интегрированная среда разработки
- 10.3. Формы и элементы управления
- Разработка и установка свойств формы
- События и методы формы
- Кнопки управления как основа выполнения действий
- 10.4. Элементы управления пользователя
- Флажки и переключатели
- Другие стандартные элементы управления
- 10.5. Фокус. Последовательность переходов. Меню Фокус
- Основы меню
- Контекстные меню
- Редактор меню
- Подсказки пользователю с помощью диалога
- Тема 11 Управление проектами
- 11.1. Работа с проектом и его структура
- 11.2. Работа с несколькими проектами
- 11.4. Установка параметров проекта
- 11.5. Дополнения и мастера
- Тема 12 Управляющие конструкции
- 12.1. Конструкции принятия решения (ветвление)
- 12.2. Циклы
- 12.3. Работа со структурами управления и досрочный выход из них
- Тема 13 Структура приложения. Техника написания кода
- 13.1. Структура приложения
- 13.2. Как работает событийное приложение
- 13.3. До начала кодирования
- 13.4. Техника написания кода
- 13.5. Автоматизация написания программы