![](/user_photo/2706_HbeT2.jpg)
- •Содержание
- •Рекомендации к проведению лабораторных работ
- •Комментарии в тексте программы
- •Компиляция и запуск программы на выполнение
- •Переменные и константы
- •Операторы и выражения
- •Оператор присваивания
- •Арифметические операции
- •Логические операции
- •Составной оператор begin..end
- •Условный оператор if..then
- •Оператор-селектор case..of
- •Операторы обработки циклов
- •Цикл с параметром for .. do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Процедуры break и continue
- •Оператор with..do
- •Процедуры и функции
- •Процедуры
- •Функции
- •1. Фундаментальные структуры данных
- •Общее понятие типа данных
- •Простой тип
- •Перечислимые типы данных
- •Поддиапазонны
- •Строковый тип
- •Структурные типы
- •Массивы
- •Записи
- •Множества
- •Представление структур в памяти
- •Задание
- •2. Работа с последовательностями, файлы
- •Доступ к файлу
- •Операции над файлами
- •Окончание файла
- •Пример работы с файлом
- •Задание
- •3. Анализ алгоритмов
- •Рост функций
- •Задание
- •4. Простейшие методы сортировки массивов
- •Оценка алгоритмов сортировки
- •Шейкер-сортировка
- •Сортировка простыми вставками
- •Сортировка бинарными вставками
- •Задание
- •5. Улучшенные методы сортировки массивов
- •Сортировка с помощью включений с уменьшающимися расстояниями (сортировка Шелла)
- •Пирамидальная сортировка
- •Сортировка с разделением (быстрая сортировка)
- •Задание
- •6. Сортировка последовательных файлов
- •Сортировка простым слиянием
- •Естественное слияние
- •Задание
- •7. Рекурсивные алгоритмы
- •Сравнение рекурсии и итерации
- •Задание
- •8. Динамические структуры данных, связные списки
- •Списки
- •Пример создания и заполнения списка
- •Задание
- •9. Нелинейные структуры данных
- •Граф
- •Бинарное дерево
- •Задание
- •10. Алгоритмы на графах
- •Алгоритмы обхода в глубину и по уровням
- •Построение минимального остовного дерева
- •Поиск кратчайшего пути
- •Задание
- •11. Поиск данных
- •Двоичный (бинарный) поиск элемента в массиве
- •Интерполяционный поиск элемента в массиве
- •Алгоритм Бойера-Мура
- •Задание
- •12. Хеширование
- •Отечественный стандарт хеширования
- •Создание хеш-функции
- •Хеш-функции для строковых значений, алгоритм Гонера
- •Задание
- •13. Методы сжатия текстовых данных
- •Метод “Running”
- •Словарные методы сжатия
- •Алгоритм Хаффмана
- •Задание
- •14. Алгоритмы вывода графических примитивов
- •Рисование отрезка
- •Прямое вычисление координат
- •Инкрементный алгоритм Брезенхэма
- •Простейший алгоритм закрашивания замкнутой области
- •Задание
- •15. Псевдослучайные последовательности
- •Метод середин квадратов
- •Линейный конгруэнтный метод
- •Генератор псевдослучайных чисел, поставляемый с системой
- •Оценка качества генератора ПСП
- •Задание
- •16. Параллельные алгоритмы
- •Пример многопоточного приложения
- •Задание
- •Задание на СКР
- •Вариант 1. Клеточные автоматы
- •Вариант 2. Раскрашивание карты
- •Вариант 3. Крисс-кросс
- •Вариант 4. Лабиринт
- •Список использованной литературы
- •Приложение A. Справочник по функциям Delphi
- •Операции с порядковыми типами
- •Математические функции и процедуры
- •Генерация псевдослучайного числа
- •Преобразование типов данных
- •Работа с памятью
- •Приложение Б. Компонент-сетка TStringGrid
- •Приложение В. Компонент-диаграмма TChart
- •Приложение Д. Элементарный поток – класс TThread
![](/html/2706/363/html_6nPrlBqXsZ.l5CD/htmlconvd-KP4AzT32x1.jpg)
32
4. Простейшие методы сортировки массивов
Вид занятия – лабораторная работа Цель – исследование простейших методов сортировки одномерных массивов
Продолжительность – 4 часа
Под сортировкой понимается процесс перестановки объектов какого-то множества в определённом порядке.
Цель сортировки – облегчить последующий поиск элементов в отсортированном множестве.
Поиск прототипов современных методов сортировки начался в XIX веке. Герман Холлерит в 1888 году изобрёл электрический табулятор, работа которого базировалась на принципах поразрядной сортировки.
Сортировка является примером огромного разнообразия алгоритмов, выполняющих одну и ту же задачу, многие из которых являются оптимальными, имея какое-то преимущество над остальными.
Выбор алгоритма сортировки очень сильно зависит от структуры данных. Текущая лабораторная работа посвящена сортировкам массивов.
Оценка алгоритмов сортировки
Алгоритмы сортировки обычно оцениваются по 3 параметрам:
1.Время сортировки – основной параметр, характеризующий быстродействие алгоритма.
2.Память – ряд алгоритмов требует выделения дополнительной памяти под временное хранение данных.
3.Устойчивость – устойчивая сортировка не меняет взаимного расположения равных элементов. Такое свойство может быть очень полезным, если они состоят из нескольких полей, а сортировка происходит по одному из них.
Если критерий экономии памяти принят за ограничение, то удобная мера эффективности получается при подсчёте числа C необходимых сравнений ключей и M пересылок элементов.
Числа M и C определяются функциями от числа N сортируемых элементов. Рассматриваемые сегодня алгоритмы предусматривают N2 сравнений. Это далеко не лучший показатель, поэтому все эти алгоритмы относятся к классу простых.
Сортировка простым обменом (пузырьковый метод)
Алгоритм сортировки простым обменом основан на следующем принципе: осуществляется просмотр всех элементов массива с целью выявления элемента с наименьшим весом, найденный элемент переносится в первую позицию массива, а основные элементы смещаются. На следующей итерации алгоритма процедура повторяется, но уже без учёта первого элемента, и т.п. Очень часто этот метод называют “пузырьковым”, когда элемент с наименьшим весом всплывает на поверхность.
Работа алгоритма становится нагляднее, |
Рисунок 4.1.– Сортировка простым обменом |
если развернуть массив по вертикали |
|
|
|
![](/html/2706/363/html_6nPrlBqXsZ.l5CD/htmlconvd-KP4AzT33x1.jpg)
33
(см. рис. 4.1).
Шейкер-сортировка
Сортировка пузырьковым методом обладает примечательным недостатком – один неправильно расположенный “лёгкий пузырёк” расположенный в “тяжёлом конце” всплывёт на место за один проход.
Например: 12,8,42,44,55,67,94,06
Неправильно расположенный элемент в “лёгком” конце массива будет опускаться за несколько проходов.
Например: 94,06,12,8,42,44,55,67
Эта неестественная асимметрия подсказывает направление улучшения алгоритма – менять направление следующих друг за другом проходов. Работа такого алгоритма продемонстрирована рисунком 4.2.
В отличие от сортировки пузырьком (которая не находит места в серьёзных программах), шейкер-сортировка с успехом применяется в тех случаях, когда заранее известно, что все элементы почти упорядочены.
44 |
06 |
06 |
06 |
06 |
06 |
06 |
06 |
55 |
44 |
44 |
12 |
12 |
12 |
12 |
12 |
12 |
55 |
55 |
55 |
55 |
18 |
18 |
18 |
42 |
12 |
12 |
44 |
44 |
44 |
44 |
42 |
94 |
42 |
42 |
42 |
42 |
42 |
42 |
44 |
18 |
94 |
67 |
67 |
18 |
55 |
55 |
55 |
06 |
18 |
18 |
18 |
67 |
67 |
67 |
67 |
67 |
67 |
94 |
94 |
94 |
94 |
94 |
94 |
Рисунок 4.2.– Шейкер-сортировка
Сортировка простым выбором
Метод основан на следующем правиле:
1.Находится элемент с наименьшим ключом;
2.Он меняется местами с первым элементом a1.
Эти операции повторяются с n-1 элементами, затем с n-2, и т.д. пока не останется только один элемент – наибольший (см. рис. 4.3).
44 |
55 |
12 |
42 |
94 |
18 |
06 |
67 |
06 |
55 |
12 |
42 |
94 |
18 |
44 |
67 |
06 |
12 |
55 |
42 |
94 |
18 |
44 |
67 |
06 |
12 |
18 |
42 |
94 |
55 |
44 |
67 |
06 |
12 |
18 |
42 |
94 |
55 |
44 |
67 |
06 |
12 |
18 |
42 |
44 |
55 |
94 |
67 |
06 |
12 |
18 |
42 |
44 |
55 |
94 |
67 |
06 |
12 |
18 |
42 |
44 |
55 |
67 |
94 |
Рисунок 4.3. – Сортировка простым выбором
В самом общем виде алгоритм может быть сформулирован следующим образом:
FOR i:=0 TO n-1 DO
BEGIN
{ Присвоить k индекс наименьшего из a[i] … a[n]; Поменять местами a[i] и a[k]}
END;
![](/html/2706/363/html_6nPrlBqXsZ.l5CD/htmlconvd-KP4AzT34x1.jpg)
34
Сортировка простыми вставками
Элементы исходного массива условно разделяются на готовую последовательность A[0], …, A[i] и входную последовательность A[i+1], …, A[n]. На каждом шаге, начиная с i=1 и увеличивая i на единицу берут i –й элемент входной последовательности и передают в готовую последовательность, вставляя его на подходящее место. Порядок работы алгоритма отражён на рисунке 4.4.
Ваш алгоритм будет выглядеть примерно так:
Var a : array [0..99] of …; begin
For i:=1 to n-1 do
Begin x:=a[i];
{вставить x в подходящее место}
End;
Обратите внимание, что сортировки простыми вставками и простым выбором являются в некоторой степени противоположностью друг другу. При простой вставке на каждом шаге рассматривается лишь один очередной элемент исходной последовательности и все элементы готовой последовательности, среди которых и находится точка вставки. При простом выборе для поиска одного элемента с наименьшим весом просматриваются все элементы исходной последовательности и найденный помещается как очередной элемент в готовую последовательность.
44 |
55 |
12 |
42 |
94 |
18 |
06 |
67 |
44 |
55 |
12 |
42 |
94 |
18 |
06 |
67 |
12 |
44 |
55 |
42 |
94 |
18 |
06 |
67 |
12 |
42 |
44 |
55 |
94 |
18 |
06 |
67 |
12 |
42 |
44 |
55 |
94 |
18 |
06 |
67 |
12 |
18 |
42 |
44 |
55 |
94 |
06 |
67 |
06 |
12 |
18 |
42 |
44 |
55 |
94 |
67 |
06 |
12 |
18 |
42 |
44 |
55 |
67 |
94 |
Рисунок 4.4. – Сортировка простыми вставками
Сортировка бинарными вставками
Алгоритм сортировки простыми вставками можно улучшить, пользуясь тем, что готовая последовательность A[0],…,A[i] (в которую нужно включить новый элемент) уже упорядочена. Поэтому место включения можно найти значительно быстрее.
Будем разбирать алгоритм, рассматривая его действия на i-м шаге. Как говорилось выше, последовательность к этому моменту разделена на две части: готовую A[0]...A[i] и неупорядоченную A[i+1]...A[n]. Выбираем любой элемент из неупорядоченной последовательности и сравниваем его с элементом, находящимся в центре уже отсортированной последовательности.
Рисунок 4.5.– Шаг сортировки бинарными включениями
Произведя сравнение, мы получаем важную информацию о том, в какой половине уже отсортированной последовательности должен оказаться очередной элемент. В нашем случае (см. рис. 4.5) элемент 18 меньше 44, поэтому он должен попасть левее элемента массива со значением 44. Далее операция повторяется с выбранной частью отсортированной последовательности до тех пор, пока наш элемент не попадёт в установленное место.
![](/html/2706/363/html_6nPrlBqXsZ.l5CD/htmlconvd-KP4AzT35x1.jpg)
35
Задание
1.1. Подготовьте одномерный массив целых чисел произвольной размерности и заполните его случайными значениями. Разработайте пять функций сортирующих произвольный массив целых чисел изучаемыми на лабораторной работе простыми методами сортировки.
2.Разработайте процедуру сортировки 2-хмерного массива с применением любого из изученных вами алгоритмов сортировок. Подумайте, можно ли её сделать универсальной – способной упорядочивать произвольные N-мерные массивы.
3. Объявите одномерный массив, типизированный типом данных TPoint. type TPoint = packed record
X:Longint;
Y:Longint;
end;
Заполните массив случайными числами и разработайте процедуру сортировки упорядочивающую элементы массива одновременно по полям X и Y.
Совет. Разработайте универсальную процедуру вывода содержимого массива на экран и используйте её для оценки правильности работы ваших программ.