- •Введение в программирование и основы алгоритмизации
- •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.5. Быстрая сортировка
В пузырьковой сортировке производились обмены ключей (записей) в соседних позициях. В пирамидальной сортировке такие обмены совершались между ключами в позициях, связанных друг с другом бинарным деревом. Алгоритм сортировки Хоора или сортировки с разделение или быстрой сортировки использует иной механизм выбора значений для обменов. В названиях алгоритма подчеркиваются автор, или способ сортировки – последовательного дробления массива на части, или его эффективность. В подавляющем большинстве случаев быстрая сортировка дает лучшие временные результаты по сравнению с другими способами. Однако для нее нет гарантированной трудоемкости типа O(n log2 n), а в отдельных случаях ее трудоемкость достигает O(n2) и не может быть снижена. В ситуациях жесткого временного ограничения сортировку следует применять весьма осмотрительно.
Суть способа. Пусть – одномерный массив, а x – его элемент. Сначала выясним, как разбить массив S на две непустые непересекающиеся части S1 и S2 (S1 S2=S) так, чтобы в S1 оказались элементы, не превосходящие x , а в S2 – не меньше x: . Для этого рассмотрим пример. Пусть в массиве S зафиксирован элемент x=14. Просматриваем массив слева нап раво, пока не найдем . . Просматриваем массив справа налево, пока не найдем . . Меняем местами a и b. Продолжая этот процесс, придем к последовательности, разделенной на две части S1 и S2:
О
Dim S() As Integer Const
n As Integer = 10 Sub
Быстрая_сортировка() 'Отладочный
вариант Dim
T1(1 To 13) As Integer, T2(1 To 13) As Integer Dim
i As Integer, j As Integer, k As Integer, a As Integer, b As
Integer, x As Integer, var As String
ReDim S(1
To n): S(1)=6: S(2)=23: S(3)=17: S(4)=8: S(5)=14: S(6)=25: S(7)=6:
S(8)=3: S(9)=30: S(10)=7 'For
j = 1 To n: S(j) = Int(Rnd(Time) * 1000): Next j var
= "Исходные:": For j = 1 To n: var = var & "
" & Str(S(j)): Next j: MsgBox var
k
= 1: T1(1)
= 1: T2(1)
= n: 'Инициализация
стека
Do:
a
= T1(k):
b
= T2(k):
k
= k
– 1 'Чтение из стека (выбор адресов не
отсортированной правой части)
Do:
i
= a
- 1: j
= b
+ 1: x
= S((a
+ b)\2) 'Разделение
массива или его части Do:
Do: i = i + 1: Loop While S(i) < x: Do: j = j - 1: Loop While x <
S(j)
If
i
>= j
Then 'Смыкание
или перехлест границ частей массива
If i <>
j Then i = i – 1 'Раздвижка
границ j
= j + 1: GoTo 1 Else
Swap S(i),
S(j) 'Обмен
"чужих"
на
"своих" End
If Loop
While j - i > 2
If
j
- i
= 2 Then 'Выяснение
граничной ситуации
If S(i +
1) < x Then 'Люфт
границ
i
= i
+ 1
Else
'Четкое разделение границ
j = j - 1
End If
End If 1:
If
j
< b
Then 'Правая
часть массива не исчерпана
k
= k
+ 1: T1(k)
= j:
T2(k)
= b 'Запись
в стек (фиксация не отсортированной
правой части)
End
If
b
= i
'Фиксация правой границы еще не
отсортированной левой части
Loop
While
a
< b 'Левая
часть не исчерпана
Loop
While
k
> 0 'Переход к анализу правой части
var
= "Отсортированные:": For j = 1 To n: var =
var & " " & Str(S(j)): Next j: MsgBox var End
Sub Sub
Swap(ByRef x As Integer, ByRef y As Integer) 'Обмен
значениями Dim
m As Integer m
= x: x = y: y = m End
Sub
Выше приведена программа быстрой сортировки. В ней хранение адресов организовано в виде наращиваемого стека, выборка из которого производится в порядке, обратном занесению, т.е. последняя часть массива, адреса которой внесены в стек, обрабатывается первой. Сортировка идет в порядке возрастания значений элементов массива. При этом левая часть раздвоенной сортируемой последовательности сразу идет в дальнейшую обработку, а правая в виде начального и конечного адресов – сохраняется в стеке. Таким образом, в стеке сохраняются правые части раздвоенных ссужающихся последовательностей. Левая часть ссужающихся последовательностей обрабатывается до тех пор, пока ее границы не сомкнутся – последовательность вырождается в один элемент. Самым сложным моментом в алгоритме является анализ граничных ситуаций между частями последовательности – совместный анализ правой границы левой части и левой границы правой части. Выделяются четыре вида таких ситуаций.
1). Перехлест, когда правая граница левой части перешла левую границу правой части, но проходит по соседним элементам – раздвоение границ. Данная ситуация возникает, когда границы в результате своего движения синхронно подходят к двум соседним элементам слева и справа и при этом значения элементов располагаются по обе стороны выбранного уровня разделения (переменная x в программе) – левый элемент ниже уровня, а правый элемент выше уровня.
2). Смыкание, когда границы накладываются друг на друга, т.е. проходят по одному и тому же элементу. Ситуация возникает, когда границы синхронно подходят к элементу, значение которого совпадает с выбранным уровнем разделения.
3). Четкое разделение – границы не смыкаются, т.е. приходятся на соседние элементы.
4). Люфт, когда между границами располагается один непроанализированный элемент.
Следует отметить, что в отличие от первых двух ситуаций, возникающих в результате нерегулируемого движения границ (индексы i и j в программе), две последние ситуации организуются целенаправленно. Каждая из этих ситуаций должна быть проанализирована и в каждом случае должны быть вставлены регуляторы границ, чтобы привести их к четкому единому разделению. Для этого используется анализ элемента в ситуации люфта и передвижка границ, как в этой ситуации, так и при их перехлесте и смыкании.