- •Введение в программирование и основы алгоритмизации
- •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. Автоматизация написания программы
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