
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Сортировка вставками (InsertSort)
a[0] a[1] a[2] a[3] a[4]
исходный массив 5 2 4 7 3
обработка a[1]=2 2 5 | передвинуть 5 в поз.1, вставить 2 в поз.0
обработка a[2]=4 2 4 5 | передвинуть 5 в поз.2, вставить 4 в поз.1
обработка a[3]=7 2 4 5 7 | элемент 7 на месте
обработка a[4]=3 2 3 4 5 7 | сдвинуть хвост массива
| вправо, вставить 3 в поз.1
| массив отсортирован
Обменов в этой сортировке нет.
Вычислительная сложность сортировки вставками
Сортировка
вставками требует фиксированного числа
проходов -
.
В
проходах включаются элементы
В
-м
проходе включения производятся в часть
массива
и требуют в среднем
сравнений. Общее число сравнений равно:
Сложность
алгоритма измеряется числом сравнений.
Наилучший случай – при уже отсортированном
массиве. Тогда число сравнений равно
.
Наихудший случай – при пересортировке.
Каждая вставка произойдет в точке
,
и в
-м
проходе требуется
сравнений. Тогда общее число сравнений
равно
.
Быстрая сортировка (QuickSort)
индексы 0 1 2 3 4 5 6 7 8 9
исх. массив 80 15 30 60 55 65 40 35 45 70 l=0 m=(l+h)/2=4 h=9
a[m]=55 – центральный элемент
Все элементы массива разбиваются на 2 подмассива:
-
нижний, - содержит элементы, меньшие или
равные центральному;
-
верхний, содержит элементы большие, чем
центральный.
Поскольку
известно, что
будет последним в
,
то он меняется местами с
.
Затем сканируют
с помощью двух индексов -
и
.
Целью прохода является определение
элементов для
и
.
Сначала
перемещается
.
При
индекс
останавливается. Затем перемещается
вниз
и при
останавливается.
Элементы
и
находятся не в своих подмассивах, и
поэтому они меняются местами:
.
Конечные положения
и
-
они заходят друг за друга. При этом
находится
в подмассиве, элементы которого
.
Это точка разбиения подмассивов и
позиция для центрального элемента.
Поэтому -
.
В результате первого просмотра массива (это первая фаза быстрой сортировки, - фаза сканирования) получим:
Затем
подмассив
(за исключением
и подмассив
обрабатываются точно так же, т.е. переходят
к рекурсивной фазе обработки. Рекурсивный
процесс прекращается на пустом или
одноэлементном подмассивах.
//------------------------------------------------------------------------------------
void QuickSort(int l, int h)
{
int su, sd, m, p;
if(h-l==0) return; //если в массиве меньше 2-х элементов, вернуться
else if(h-l==1) //если в массиве 2 элемента
{ if(a[h]<a[l]) {swap(a[l], a[h]); obm++; }
sr++; return;
}
m=(l+h)/2; p=a[m]; swap(a[m], a[l]); obm++; su=l+1; sd=h;
do{
while(su<=sd&&a[su]<=p) {su++; sr++;}
while(p<a[sd]) { sd--; sr++; }
if(su<sd) {swap(a[su], a[sd]); obm++; }
} while(su<sd);
a[l]=a[sd]; a[sd]=p; obm++;
if(l<sd-1) QuickSort(l, sd-1);
if(sd+1<h) QuickSort(sd+1, h);
}
//--------------------------------------------------------------------------------------
Вызов функции - QuickSort(0, n-1).
Вычислительная сложность быстрой сортировки
Общий анализ сложен, можно рассмотреть при некоторых допущениях.
Пусть
размер массива
,
или
,
а центральный элемент располагается
точно посередине массива и каждого
подмассива.
При
первом сканировании производится
сравнений. В результате создаются 2
подмассива размером
.
При втором – обработка каждого из двух
подмассивов потребует
сравнений и т.д. Общее число сравнений:
.
Этот случай соответствует уже отсортированному массиву. Но практически то же происходит при пересортировке массива. Предположим, массив отсортирован по убыванию:
После первого прохода получим:
4 1 2 3 5 8 6 7
Массив почти отсортирован по возрастанию.
Наихудший случай: центральный элемент все время попадпет в одноэлементный подмассив, а все прочие элементы остаются во втором подмассиве. Это происходит тогда, когда центральным всегда является наименьший элемент. Например: 8 3 1 5 9.
Здесь
в первом проходе производится
сравнений, во втором -
,
и т.д. Общее число сравнений:
.
Видно, что в наихудшем случае быстрая сортировка не лучше, чем вставками и выбором. Однако этот случай маловероятен на практике. Поэтому производительность быстрой сортировки выше, чем у всех рассмотренных выше сортировок.