- •Структуры и алгоритмы обработки данных
- •Логическая и физическая структуры данных
- •Классификация структур данных
- •Основные операции над структурами данных
- •Алгоритм и примеры задач, решаемых с помощью алгоритмов
- •Адресация и распределение памяти
- •Адресные пространства и модели оперативной памяти
- •Формирование физического адреса в реальном режиме
- •Особенности адресации в защищенном режиме
- •Кэширование
- •Анализ алгоритмов
- •Быстродействие – основной показатель эффективности алгоритма
- •Подсчет числа простейших операций
- •Лучший, средний и худший случаи
- •Алгоритмы и платформы
- •Виртуализация памяти
- •Использование кэша
- •Выравнивание данных
- •Рандомизированные алгоритмы
- •Общая характеристика записей и способы описания в Delphi
- •Многоуровневые записи
- •Выравнивание и упакованные записи
- •Записи с вариантной частью
- •Массивы
- •Общая характеристика массивов
- •Статические (стандартные) массивы
- •Многомерные статические массивы
- •Свойства статических массивов
- •Открытые массивы
- •Динамические массивы
- •Динамические векторы
- •Многомерные динамические массивы
- •Массивы типа Variant
- •Вставка и удаление в массиве
- •Связные списки и алгоритмы их обработки
- •Списки и их разновидности
- •Односвязный список
- •Общая характеристика односвязного списка
- •Структура элемента односвязного списка
- •Формирование односвязного списка
- •Просмотр односвязного списка
- •Вставка элемента в односвязный список
- •Удаление элемента из односвязного списка
- •Линейный двухсвязный список
- •Структура элемента двухсвязного списка
- •Реализация операций в линейном двухсвязном списке
- •Нелинейный двухсвязный список
- •Нелинейный трехсвязный список
- •Определение плекса и его общие признаки
- •Иерархическая списковая структура. Сетевая структура
- •Достоинства и недостатки связных списков
- •Функциональные и свободные списки
- •Общая характеристика функционального и свободного списка
- •Методы формирования свободного списка
- •Стеки, очереди, деки и операции в них
- •Общая характеристика
- •Очередь
- •Динамические множества и словари
- •Общая характеристика
- •Операции в динамических множествах
- •Деревья
- •Общая характеристика и некоторые определения
- •Представление дерева в памяти
- •Естественное представление дерева
- •Представление дерева с помощью вектора
- •Представление дерева с использованием списков сыновей
- •Методы обхода деревьев
- •Бинарное дерево
- •Структура бинарного дерева
- •Формирование бинарного дерева
- •Обход бинарного дерева
- •Преобразование любого дерева к бинарному дереву
- •Включение и исключение в дереве
- •Включение в дереве
- •Исключение в дереве
- •Поиск: определение и общая терминология
- •Линейный (последовательный) поиск
- •Последовательный поиск в упорядоченной таблице
- •Последовательный поиск при накоплении запросов
- •Индексно-последовательный поиск
- •Бинарный поиск
- •Поиск, использующий бинарное дерево
- •Сортировка
- •Общие сведения и некоторые определения
- •Внутренняя сортировка
- •Сортировка прямыми включениями
- •Сортировка бинарными включениями
- •Сортировка прямым выбором
- •Сортировка прямым обменом
- •Сортировка методом Шелла
- •Сортировка с помощью бинарного дерева
- •Пирамидальная сортировка
- •Быстрая сортировка разделением
- •Внешняя сортировка
- •Сортировка прямым слиянием
- •Сортировка естественным слиянием
- •Сортировка многопутевым слиянием
- •Многофазная сортировка
- •Хеширование и хеш-таблицы
- •Общие сведения и определения
- •Коллизии при хешировании
- •Разрешение коллизий при хешировании
- •Разрешение коллизий методом открытой адресации
- •Разрешение коллизий методом цепочек
- •Функции хеширования
- •Поисковые деревья
- •Бинарное дерево поиска
- •Структура бинарного дерева поиска и алгоритм поиска
- •Вставка элемента в бинарное дерево поиска
- •Удаление из бинарного дерева поиска
- •Красно-черные деревья
- •Определение красно-черного дерева, структура его элементов
- •Повороты
Внутренняя сортировка
Внутреннюю сортировку иногда называют сортировкой массивов, поскольку сортируемая во внутренней памяти таблица, как правило, организуется как вектор записей. Основное требование к методам сортировки массивов экономное использование памяти. Это означает, что переупорядочение элементов нужно выполнять на том же месте, где и расположен массив, и что методы, которые пересылают элементы из одного массива в другой, не представляют интереса. Такие методы называются сортировками «на том же месте» (in sity).
Существует несколько несложных и очевидных способов сортировки, называемых прямыми (простыми) сортировками. Эти простые методы стоит рассмотреть прежде, чем перейти к более быстрым алгоритмам, по следующим трем причинам:
простые методы особенно хорошо подходят для разъяснения свойств большинства принципов сортировки;
программы, основанные на этих методах, легки для понимания и коротки;
хотя сложные методы требуют меньше числа операций, эти операции более сложны; поэтому при достаточно малых числах сортируемых элементов простые методы работают быстрее, но их не следует использовать при большом числе сортируемых элементов.
Более сложные по сравнению с прямыми сортировками методы (Шелла, пирамидальная сортировка и т. д.) называются усовершенствованными сортировками; они применяются для упорядочения больших (по количеству элементов) таблиц.
Методы, сортирующие элементы «на том же месте», можно разбить на три основных класса в зависимости от лежащего в их основе приема:
сортировка включениями (вставками),
сортировка выбором (выделением),
сортировка обменом.
Сортировка прямыми включениями
Этот метод обычно используют игроки в карты. Элементы (карты) условно разделяют на готовую a[0], ..., a[i-1] и входную (неупорядоченную) последовательности a[i], ..., a[HighIndex]. Готовая последовательность уже упорядочена, т. е. для нее выполняется соотношение:
a[0].Кey a[1].Кey ... a[i-1].Кey
На каждом шаге, начиная с i=1 и увеличивая i на единицу, берется i-й элемент входной последовательности и передается в готовую последовательность, вставляя на подходящее место.
В общем случае этапы метода, заключающиеся в выполнении одинаковых действий, называются проходами. Проход метода прямого включения состоит в локализации включаемого элемента и перемещении его в готовую последовательность на нужное место.
В общем виде алгоритм сортировки прямыми включениями выглядит следующим образом:
For i:=1 To HighIndex Do
Begin
x:=a[i];
вставить x на подходящее место в a[0]. . . a[i-1];
end;
Процесс сортировки прямыми включениями показан на примере восьми случайно взятых чисел:
На i-ом проходе i-ый ключ сравнивается с (i-1)-ым ключом, и если a[i-1].Кey > a[i].Кey, то элементы a[i-1] и a[i] обмениваются местами. Затем «новый» ключ a[i-1].Кey сравнивается с предыдущим ключом a[i-2].Кey и т. д. Таким образом, на каждом проходе часть элементов готовой последовательности сдвигается на одну позицию вправо, освобождая место для включаемого элемента. Этот процесс называется «просеиванием» элемента a[i].
Алгоритм сортировки прямыми включениями может иметь следующую реализацию:
Рrocedure DirInsSort;
Var i, j: Integer;
x: TElement;
Begin
For i:=1 To HighIndex Do Begin
For j:= i-1 Downto 0 Do
If a[j+1].Кey < a[j].Кey
Then Begin
x:= a[j+1]; a[j+1]:= a[j];
a[j]:= x;
End
Else break;
End;
End;