Сортировка вставками
Лабораторная работа №4
1. Цель и задачи работы
Рзучение метода сортировки массивов методом включений. Написание программы, демонстрирующей изученные принципы.
2. Теоретические сведения
Сортировка методом включений
Разделим условно РІСЃРµ записи РЅР° готовую последовательность:
R1, R2, …, Ri-1;
и входную (исходную) последовательность:
Ri, Ri+1, …, Rn.
На каждом шаге, начиная с i=2 и увеличивая i на единицу, будем извлекать очередной i-й элемент из входной последовательности, и вставлять его в готовую последовательность, при этом элемент вставляется на нужное место.
В таблице 1 представлен пример процесса сортировки с помощью включений восьми случайно выбранных чисел.
Таблица 1. Пример сортировки с помощью включений
№ итерации | Последовательность | |||||||
Рсходный | 44 | 55 | 12 | 42 | 94 | 18 | 06 | 67 |
2 | 44 | 55 | 12 | 42 | 94 | 18 | 06 | 67 |
3 | 12 | 44 | 55 | 42 | 94 | 18 | 06 | 67 |
4 | 12 | 42 | 44 | 55 | 94 | 18 | 06 | 67 |
5 | 12 | 42 | 44 | 55 | 94 | 18 | 06 | 67 |
6 | 12 | 18 | 42 | 44 | 55 | 94 | 06 | 67 |
7 | 06 | 12 | 18 | 42 | 44 | 55 | 94 | 67 |
8 | 06 | 12 | 18 | 42 | 44 | 55 | 67 | 94 |
При поиске подходящего места для текущего элемента удобно чередовать сравнения и движения по последовательности, т.е. текущий элемент сравнивается с очередным элементом Rj, а затем либо текущий элемент вставляется на свободное место, либо Ri сдвигается вправо, и процесс «уходит» влево.
При этом, пересылая текущий элемент с места l на место k, мы заполняем место l элементом с индексом (l-1), а пустое место элемента (l-1) элементом с индексом (l-2), и так далее, до бывшего элемента с индексом k, который становится на место (k+1). Другими словами сдвигаем последовательность вправо.
Данное «просеивание» может закончиться в двух случаях:
1. Найден элемент Ri с ключом, меньшим, чем ключ текущего элемента.
2. Достигнут левый край готовой последовательности.
Рти РґРІР° условия окончания цикла дает возможность рассмотрения фиктивного элемента — барьера. Ртот элемент может быть РЅРµ включен РІ сортировку, что приведет Рє ошибке алгоритма или Рє ошибочной сортировке. Для решения этой проблемы достаточно расширить диапазон индексов РЅР° РѕРґРЅСѓ ячейку РІ описании элементов Ri.
Алгоритм сортировки простыми включениями легко можно улучшить, пользуясь тем, что готовая последовательность, в которую нужно вставить новый элемент, уже упорядочена. Поэтому место включения можно найти гораздо быстрее. Очевидно, что здесь можно применить бинарный поиск, который исследует средний элемент готовой последовательности и продолжает деление пополам, пока не будет найдено место включения. Модифицированный алгоритм сортировки называется сортировкой бинарными включениями.
Анализ сортировки прямыми и бинарными включениями
При сортировке прямыми включениями число сравнений ключей (Ci) при i-м просеивании составляет самое большое (i-1), самое меньшее — 1; если предположить, что все перестановки из N ключей равновероятны, то среднее число сравнений — i/2. Число пересылок (присваиваний элементов) Mi равно (Ci+2) (учитывая барьер). Поэтому общее число сравнений и пересылок можно найти по формулам:
Cmin= N-1ВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВ Mmin=3(N-1)
Cavg=Вј(N2+N-2)ВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВ Mavg=Вј(N2+9N-10)
Cmax=Вј(N2+N-4)ВВВВВВВВВВВВВВВВВВВВВВВВВВВВВВ Mmax=ВЅ(N2+3N-4)
Наименьшие числа появляются, если элементы с самого начала упорядочены, а наихудший (наибольшее число) случай встречается, если элементы расположены в обратном сортировке порядке. Заметим, что данный алгоритм описывает так называемую устойчивую сортировку, т.е. оставляет неизменным порядок следования элементов с одинаковыми значениями.
При сортировке бинарными включениями в конце поиска интервал должен быть единичной длины; значит, деление его пополам производится i*log2(i) раз. Таким образом:
C = [log2 i].
Количество сравнений РЅРµ зависит РѕС‚ РёСЃС…РѕРґРЅРѕРіРѕ РїРѕСЂСЏРґРєР° элементов. РќРѕ РёР·-Р·Р° округления РїСЂРё делении интервала РїРѕРёСЃРєР° пополам действительное число сравнений для i элементов может быть РЅР° 1 больше ожидаемого. РџСЂРёСЂРѕРґР° этого «перекоса» такова, что РІ результате места′ включения РІ нижней части находятся РІ среднем несколько быстрее, чем РІ верхней части. Рто дает преимущество РІ тех случаях, РєРѕРіРґР° элементы изначально далеки РѕС‚ правильного РїРѕСЂСЏРґРєР°. РќР° самом же деле минимальное число сравнений требуется, если элементы вначале расположены РІ обратном РїРѕСЂСЏРґРєРµ, Р° максимальное — если РѕРЅРё уже упорядочены. Следовательно, это случай неестественного поведения алгоритма сортировки:
C = N (log2N – log2e ± 0,5).
Рљ сожалению, улучшение, которое РјС‹ получаем, используя метод бинарного РїРѕРёСЃРєР°, касается только числа сравнений, Р° РЅРµ числа необходимых пересылок. Р’ действительности, поскольку пересылка элементов, С‚.Рµ. ключей Рё сопутствующей информации, обычно требует значительно больше времени, чем сравнение РґРІСѓС… ключей, то это улучшение РЅРё РІ коей мере РЅРµ является решающим: важный показатель Рњ (число пересылок элементов) РїРѕ-прежнему остается РїРѕСЂСЏРґРєР° N2. Р РІ самом деле, пересортировка уже рассортированного массива занимает больше времени, чем РїСЂРё сортировке простыми включениями СЃ последовательным РїРѕРёСЃРєРѕРј! Ртот пример показывает, что «очевидное улучшение» часто оказывается намного менее существенным, чем кажется вначале, Рё РІ некоторых случаях может РЅР° самом деле оказаться ухудшением.
3. Схемы алгоритмов сортировок прямым и бинарным включением
На рисунке 1 представлена схема алгоритма сортировки прямым включением, а на рисунке 2 — бинарным включением.
РРёСЃ. 1. Схема алгоритма сортировки прямым включением.
РРёСЃ. 2. Схема алгоритма сортировки бинарным включением.
4. Варианты заданий
1. Отсортировать массив, состоящий из 2n элементов.
2. Отсортировать натуральные числа (1…9), заданные в произвольном порядке.
3. Отсортировать массив, состоящий из положительных чисел.
4. Отсортировать массив, состоящий из отрицательных чисел.
5. Отсортировать массив, состоящий из положительных двузначных чисел.
6. Произвести сортировку массива, состоящего из 0 и 1, записанных в произвольном порядке.
7. Отсортировать клавиши на клавиатуре в порядке убывания их ASCII–кодов.
8. Отсортировать клавиши на клавиатуре в порядке возрастания их ASCII–кодов.
9. Отсортировать по возрастанию массив, состоящий букв введенных с клавиатуры имени и фамилии, считая что, а=1, б=2, в=3, …я=33.
10. Отсортировать массив, состоящий из (2n+1) элементов. Сортировку до (n+1)-го элемента осуществлять по возрастанию, а после (n+1)-го — по убыванию, т.е. «горкой».
1ВВВ 2ВВВ 3ВВВ 4ВВВ 5ВВВ 4ВВВ 3ВВВ 2ВВВ 1
nВВВ ВВВВВВВ n+1ВВВВ ВВВ n
11. Отсортировать массив, состоящий из (2n+1) элементов «оврагом».
5ВВВ 4ВВВ 3ВВВ 2ВВВ 1ВВВ 2ВВВ 3ВВВ 4ВВВ 5
nВВВ ВВВВВВВ n+1ВВВВ ВВВ n
12. Отсортировать последовательности, состоящие из натуральных чисел 1…9 и 9…1 и сравнить характеристики сортировки в первом и во втором случаях.
13. Провести сортировку массивов, состоящих из 25 и 26 чисел и сравнить характеристики сортировки.
14. Отсортировать массив, состоящий из отрицательных двузначных чисел в порядке убывания.
15. Реализовать метод сортировки прямым включением массива строк.
16. Реализовать метод сортировки бинарным включением, сравнить СЃ характеристиками РїСЂСЏРјРѕРіРѕ включения.
17. Реализовать метод сортировки прямым включением для матрицы. Сортировка осуществляется РїРѕ столбцам матрицы.
18. Реализовать метод сортировки бинарным включением для диагоналей матрицы.
19. Даны два массива. Построить третий массив, который включает элементы двух предыдущих. Отсортировать его по убыванию, используя метод сортировки бинарным включением.
20. Даны два массива A и B, каждый из которых состоит из n элементов (n=1, 2, 3, ...). Построить третий массив C, таким образом, что ci=ai+bi (i=1,…,n). Отсортировать его по возрастанию методом бинарного включения.
5. Указания по составлению отчета
Отчет должен содержать:
- название, цель лабораторной работы,
- постановку и описание задачи,
- решение задачи (схемы алгоритмов программ подпрограмм),
- текст составленной программы в среде программирования Delphi,
- тестовый пример,
- инструкцию пользователю,
- инструкцию программисту,
- краткие выводы.
Библиографический список
1. Вирт Н. Алгоритмы + структуры = программы: пер. с англ. М.: Мир, 1985.
2. Вирт Н. Алгоритмы и структуры данных: пер. с англ. М.: Мир, 1989.
3. РљРЅСѓС‚ Р”. Рскусство программирования для РР’Рњ. Сортировка Рё РїРѕРёСЃРє. Рў.3. Рњ.: РњРёСЂ, 1977.