
- •Содержание
- •Введение
- •1. Cтруктуры данных и алгоритмы
- •1.1. Понятие структур данных и алгоритмов
- •1.2. Информация и ее представление в памяти
- •1.2.1. Природа информации
- •1.2.2. Хранение информации
- •1.3. Системы счисления
- •1.3.1. Непозиционные системы счисления
- •1.3.2. Позиционные системы счисления
- •1.3.3. Изображение чисел в позиционной системе счисления
- •1.3.4. Перевод чисел из одной системы счисления в другую
- •1.4. Классификация структур данных
- •1.5. Операции над структурами данных
- •1.6. Структурность данных и технология программирования
- •2. Простые структуры данных
- •2.1. Числовые типы
- •2.1.1. Целые типы
- •2.1.2. Вещественные типы
- •1). Число 15.375;
- •2). Десятичное число 0.0375;
- •3). Десятичное число 2.5;
- •4). Значения верхней и нижней границ диапазона положительных чисел:
- •1). Число -15.375;
- •2). Число 1.0;
- •3). Значения верхней и нижней границ диапазона положительных чисел
- •2.1.3. Десятичные типы
- •2.1.4. Операции над числовыми типами
- •2.2. Битовые типы
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечислимый тип
- •2.6. Интервальный тип
- •2.7. Указатели
- •2.7.1. Физическая структура указателя
- •2.7.2. Представление указателей в языках программирования
- •2.7.3. Операции над указателями.
- •3. Статические структуры данных
- •3.1. Векторы
- •3.2. Массивы
- •3.2.1. Логическая структура
- •3.2.2. Физическая структура
- •3.2.3. Операции
- •3.2.4. Адресация элементов с помощью векторов Айлиффа
- •3.2.5. Специальные массивы
- •3.3. Множества
- •3.3.1. Числовые множества
- •3.3.2. Символьные множества
- •3.3.3. Множество из элементов перечислимого типа
- •3.3.4. Множество от интервального типа
- •3.3.5. Операции над множествами
- •3.4. Записи
- •3.4.1. Логическое и машинное представление записей
- •3.4.2. Операции над записями
- •3.5. Записи с вариантами
- •3.6. Таблицы
- •3.7. Операции логического уровня над статическими структурами. Поиск
- •3.7.1. Последовательный или линейный поиск
- •3.7.2. Бинарный поиск
- •3.8. Операции логического уровня над статическими структурами. Сортировка
- •3.8.1. Сортировки выборкой
- •3.8.2. Сортировки включением
- •3.8.3. Сортировки распределением.
- •3.8.4. Сортировки слиянием.
- •4. Полустатические структуры данных
- •4.1. Характерные особенности полустатических структур
- •4.2. Стеки
- •4.2.1. Логическая структура стека
- •4.2.2. Машинное представление стека и реализация операций
- •4.2.3. Стеки в вычислительных системах
- •4.3. Очереди fifo
- •4.3.1. Логическая структура очереди
- •4.3.2. Машинное представление очереди fifo и реализация операций
- •4.3.3. Очереди с приоритетами
- •4.3.4. Очереди в вычислительных системах
- •4.4. Деки
- •4.4.1. Логическая структура дека
- •4.4.2. Деки в вычислительных системах
- •4.5. Строки
- •4.5.1. Логическая структура строки
- •4.5.2. Операции над строками
- •4.5.3. Представление строк в памяти.
- •5. Динамические структуры данных. Связные списки
- •5.1. Связное представление данных в памяти
- •5.2. Связные линейные списки
- •5.2.1. Машинное представление связных линейных списков
- •5.2.2. Реализация операций над связными линейными списками
- •5.2.3. Применение линейных списков
- •5.3. Мультисписки
- •5.4. Нелинейные разветвленные списки
- •5.4.1. Основные понятия
- •5.4.2. Представление списковых структур в памяти.
- •5.4.3. Операции обработки списков
- •5.5. Язык программирования lisp
- •5.6. Управление динамически выделяемой памятью
- •6. Нелинейные структуры данных
- •6.1.Графы
- •6.1.1. Логическая структура, определения
- •6.1.2. Машинное представление оpгpафов
- •6.2. Деревья
- •6.2.1. Основные определения
- •6.2.2. Логическое представление и изображение деревьев.
- •6.2.3. Бинарные деревья.
- •6.2.4. Представление любого дерева, леса бинарными деревьями.
- •6.2.5. Машинное представление деревьев в памяти эвм.
- •6.2.6. Основные операции над деревьями.
- •6.2.7. Приложения деревьев.
- •6.2.8 Деревья Хаффмена (деревья минимального кодирования)
- •6.2.9 Деревья при работе с арифметическими выражениями
- •6.2.10 Формирование таблиц символов.
- •6.2.11 Сбалансированные деревья
3.8. Операции логического уровня над статическими структурами. Сортировка
Для самого общего случая сформулируем задачу сортировки таким образом: имеется некоторое неупорядоченное входное множество ключей и должны получить выходное множество тех же ключей, упорядоченных по возрастанию или убыванию в численном или лексикографическом порядке.
Из всех задач программирования сортировка, возможно, имеет самый богатый выбор алгоритмов решения. Назовем некоторые факторы, которые влияют на выбор алгоритма (помимо порядка алгоритма).
1). Имеющийся ресурс памяти: должны ли входное и выходное множества располагаться в разных областях памяти или выходное множество может быть сформировано на месте входного. В последнем случае имеющаяся область памяти должна в ходе сортировки динамически перераспределяться между входным и выходным множествами; для одних алгоритмов это связано с большими затратами, для других - с меньшими.
2). Исходная упорядоченность входного множества: во входном множестве (даже если оно сгенерировано датчиком случайных величин) могут попадаться упорядоченные участки. В предельном случае входное множество может оказаться уже упорядоченным. Одни алгоритмы не учитывают исходной упорядоченности и требуют одного и того же времени для сортировки любого (в том числе и уже упорядоченного) множества данного объема, другие выполняются тем быстрее, чем лучше упорядоченность на входе.
3). Временные характеристики операций: при определении порядка алгоритма время выполнения считается обычно пропорциональным числу сравнений ключей. Ясно, однако, что сравнение числовых ключей выполняется быстрее, чем строковых, операции пересылки, характерные для некоторых алгоритмов, выполняются тем быстрее, чем меньше объем записи, и т.п. В зависимости от характеристик записи таблицы может быть выбран алгоритм, обеспечивающий минимизацию числа тех или иных операций.
4). Сложность алгоритма является не последним соображением при его выборе. Простой алгоритм требует меньшего времени для его реализации и вероятность ошибки в реализации его меньше. При промышленном изготовлении программного продукта требования соблюдения сроков разработки и надежности продукта могут даже превалировать над требованиями эффективности функционирования.
Разнообразие алгоритмов сортировки требует некоторой их классификации. Выбран один из применяемых для классификации подходов, ориентированный прежде всего на логические характеристики применяемых алгоритмов. Согласно этому подходу любой алгоритм сортировки использует одну из следующих четырех стратегий (или их комбинацию).
1). Стратегия выборки. Из входного множества выбирается следующий по критерию упорядоченности элемент и включается в выходное множество на место, следующее по номеру.
2). Стратегия включения. Из входного множества выбирается следующий по номеру элемент и включается в выходное множество на то место, которое он должен занимать в соответствии с критерием упорядоченности.
3). Стратегия распределения. Входное множество разбивается на ряд подмножеств (возможно, меньшего объема) и сортировка ведется внутри каждого такого подмножества.
4). Стратегия слияния. Выходное множество получается путем слияния маленьких упорядоченных подмножеств.
Далее приводится обзор (далеко не полный) методов сортировки, сгруппированных по стратегиям, применяемым в их алгоритмах. Все алгоритмы рассмотрены для случая упорядочения по возрастанию ключей.