
- •1. Основные понятия сортировки и поиска.
- •1.1. Сортировка.
- •1.2. Поиск.
- •2.1. Лабораторная работа № 1. Сортировка методом попарной перестановки (“метод пузырька”).
- •Методические указания.
- •Порядок выполнения работы.
- •Массив чисел (ключей)
- •Содержание отчета.
- •Контрольные вопросы.
- •2.2. Лабораторная работа № 2. Сортировка информационных массивов методом подсчета.
- •Методические указания
- •Порядок выполнения работы.
- •Содержание отчета.
- •Контрольные вопросы.
- •2.3. Лабораторная работа № 3. Сортировка информационных массивов методом вставки.
- •Методические указания
- •Порядок выполнения работы.
- •Содержание отчета.
- •Контрольные вопросы.
- •2.4. Лабораторная работа № 4. Сортировка информационных массивов методом Шелла.
- •Методические указания.
- •Порядок выполнения работы.
- •Содержание отчета.
- •Контрольные вопросы.
- •2.5. Лабораторная работа № 5. Последовательный поиск в информационном массиве.
- •Методические указания.
- •Порядок выполнения работы.
- •Содержание отчета.
- •Контрольные вопросы.
- •2.6. Лабораторная работа № 6. Бинарный поиск в информационном массиве.
- •Методические указания.
- •Порядок выполнения работы.
- •Содержание отчета.
- •Контрольные вопросы.
- •3. Литература.
- •Приложение 5 Бинарный поиск
Порядок выполнения работы.
Ознакомится с описанием лабораторной работы №3. Изучить алгоритм сортировки методом вставки и познакомиться по литературе с алгоритмами, использующими метод вставки.
Изучить блок-схему сортировки методом вставки.
Написать последовательность упорядочения заданного массива методом вставки (см. пример сортировки).
Произвести подсчет числа сравнений и количества пересылок, полученных при сортировке вашего варианта массива методом вставки. Сравните полученные данные при сортировке этим методом с сортировками методом пузырька (лабораторная работа №1) по эффективности.
Дать сравнительный анализ результатов сортировки вручную с теоретическими результатами расчетов, которые необходимо провести.
Провести сортировку заданного массива на ЭВМ.
Содержание отчета.
Краткое изложение рассматриваемого метода сортировки, целей и задач лабораторной работы.
Блок-схема алгоритма рассмотренной сортировки.
Таблица последовательности сортировки вручную заданного массива чисел.
Анализ эффективности алгоритма метода вставок с подсчетом числа сравнений и количества пересылок при ручной сортировке.
Сравнительный анализ с теоретическими данными и с методами пузырька и выбора.
Результаты сортировки на ЭВМ (листинг с комментариями).
Контрольные вопросы.
Является ли метод сортировки простыми вставками устойчивым?
Сравните сложность программы для методов пузырька и вставок.
Требуется ли при использовании метода вставок резерв памяти?
Что такое число инверсий?
Зависит ли число сравнений и пересылок от исходного массива чисел?
Для чего необходима сортировка?
2.4. Лабораторная работа № 4. Сортировка информационных массивов методом Шелла.
Цель работы: изучение процесса сортировки информационных машинных массивов методом Шелла.
Методические указания.
В данной лабораторной работе, последней из цикла, на примере сортировки Шелла вы получите представление о том, как можно на базе основного метода значительно усовершенствовать способ сортировки.
Для алгоритма сортировки, который каждый раз перемещает запись только на одну позицию (как в методе простых вставок), среднее время работы будет в лучшем случае пропорционально N2. Поэтому если мы хотим получить метод, существенно превосходящий по скорости простые вставки, то необходим некоторый механизм, с помощью которого записи могли бы перемещаться большими скачками, а не короткими шажками.
Такой метод впервые был предложен Л.Шеллом в 1959г. Метод Шелла часто называют “сортировкой с убывающим шагом”. Метод Шелла заключается в том, что сортируемый массив разбивается на группы, а затем каждая группа сортируется методом простых вставок. Процесс разбиения массива на группы уже большего размера и сортировка элементов в них, будут продолжаться до тех пор, пока все элементы не будут объединены в одну группу.
Алгоритм метода Шелла можно определить следующим образом. Для управления процессом сортировки используется вспомогательная последовательность убывающих шагов h, = t, t-1, t-2,…,1; причем последний шаг h1 всегда равен единице h1=1. Весь процесс сортировки разбивается на отдельные просмотры массива.
При первом просмотре методом простых вставок сортируются элементы, отстоящие друг от друга на ht позиций. В результате получаем упорядоченные подгруппы элементов, значения ключей которых удовлетворяют соотношению
при
При
2-м просмотре методом простых вставок
сортируются элементы, отстоящие друг
от друга на ht-1
позиций. В
результате получаем упорядоченные
подгруппы элементов, в каждой из которых
ключи упорядочены, т.е. удовлетворяют
соотношению
при
и так далее.
При последнем просмотре устанавливается шаг h1 и производится сортировка массива простыми вставками, которая ничем не отличается от сортировки, рассмотренной в лабораторной работе №3.
Если назвать каждый просмотр “h – сортировкой”, то сортировка методом Шелла состоит из ht сортировки, за которой следует ht-1 сортировка, …, за которой следует h1 сортировка. Подфайл, в котором Ki Ki+h при 1 i N-h, будем называть h-упорядоченным.
Эффективность сортировки методом Шелла достигается за счет того, что в каждом из промежуточных процессов сортировки участвуют либо сравнительно короткие подфайлы, либо уже сравнительно хорошо упорядоченные подфайлы, поэтому записи довольно быстро достигают своего конечного положения.
Последовательность шагов h может быть любой, в которой последний шаг h1=1. От выбранной последовательности шагов зависит время работы алгоритма.
Для примеров будем пользоваться последовательностью: 8, 4, 2, 1. Лучшие результаты получаются при шагах: 7, 5, 3, 1. Если шаги выбирать из соотношения
при 1
t = [log2N] (2.11),
то максимальное время работы алгоритма Шелла (оценка) есть N3/2.
Преимущества алгоритма Шелла проявляются при больших массивах.
Число сравнений и перемещений снижается примерно до C = N1,3 для тех значений N, которые встречаются на практике; при N это число можно сократить до порядка C = N(log2N)2 .
Приведем пример сортировки массива из 8 чисел (h=4, 2, 1):
Исходный массив: 7 3 5 1 2 8 4 6
1
-й
просмотр (4-сортировка)
ht = h4 – разбиение 7 3 5 1 2 8 4 6
7: 2
3: 8
5: 4
1: 6
после 1-го просмотра: 2 3 4 1 7 8 5 6
2
-й
просмотр (2-сортировка)
h
t-1
= h2
– разбиение 2 3 4 1 7
8 5 6
2: 4
3: 1
2: 4: 7
1 3: 8
2 4 7: 5
1 3 8: 6
после 2-го просмотра: 2 1 4 3 5 6 7 8
3-й просмотр (1-сортировка)
h
1
– разбиение 2 1 4 3 5 6
7 8
2: 1
1 2: 4
1 2 4: 3
1 2 3 4: 5
1 2 3 4 5: 6
1 2 3 4 5 6: 7
1 2 3 4 5 6 7: 8
Массив упорядочен: 1 2 3 4 5 6 7 8
Дугами указано разбиение элементов (ключей) на группы. Знак “ : ” означает сравнение, стрелкой показана пересылка элемента.
Алгоритм Шелла довольно просто программируется, использует минимальный объем памяти и эффективен при умеренно больших N (при N1000).
Блок-схема сортировки методом Шелла представлена в приложении 4.
В блок-схеме сортировки методом Шелла использованы следующие обозначения: n – размер массива; hi – шаг в i-м этапе; j – текущий номер 1-го из сравниваемых элементов (пересылаемого в рабочую ячейку); k – текущий номер 2-го из сравниваемых элементов; j0 – номер 1-го элемента упорядочиваемой последовательности; c – номер рабочей ячейки; M – идентификатор упорядочиваемого массива.
Блок 1 формирует шаг h1 для первого этапа процедуры. Возможные варианты внутренней структуры блока 1 описаны ниже.
Блок 2 присваивает индексам j и j0 исходные значения, равные 1 (для упорядочения 1-ой последовательности).
Блок 3 формирует номер j 1-го из двух сравниваемых элементов, подлежащего пересылке в рабочую ячейку.
Блок 4, сравнивая j с размером массива N, проверяет, не исчерпалась ли упорядоченная последовательность.
Блок 5, сравнивая элемент массива М[j] и элемент той же последовательности M[j-h] с соседним меньшим номером, проверяет, нужно или не нужно пересылать элемент M[j] в рабочую ячейку.
Если оказывается, что нужно, то блоки 6,7 выполняют первый шаг процедуры упорядочения выделенной последовательности методом вставки и подготовку последующих шагов.
Последующие шаги процедуры упорядочения последовательности методом вставки выполняются блоками 8-11.
Если блок 4 выявит, что упорядочение последовательности закончено, то осуществиться переход к блоку 12, формирующему номер первого элемента следующей последовательности, подлежащей упорядочению.
Блок 13, сравнивая номер 1-го элемнта этой последовательности с шагом h, проверяет, не закончился ли этап, и в случае, если он не закончился, осуществляет переход к блоку 3, начинающему упорядочение следующей последовательности. Если этап закончился, то осуществляется переход к блоку 14, сравнивающему шаг только что выполненного этапа с его конечным значением, равным 1, и проверяющему тем самым, не закончилась ли вся процедура упорядочения.
Если процедура не закончилась, то осуществляется переход к блоку 15, формирующему шаг для следующего этапа.
Рассмотрим два основных варианта внутренней структуры блоков 1 и 15, формирующих первый и очередной шаги.
Вариант № 1. Шаг h1 формируется путем сдвига вправо на один разряд двоичного кода размера массива n: h = h1 : = n 2
Последующие шаги формируются путем сдвига вправо на один разряд кода предыдущего шага с установкой младшего его разряда в 1:
h : = h 2;
h : = h V a (a = 0…01 = 1, V – операция поразрядного логического сложения кодов). Тем самым обеспечивается некратный шаг после любого из этапов процедуры.
Вариант № 2. Шаг h1 формируется путем сдвига вправо на один разряд кода размера массива с последующей установкой в 1 группы из семи его младших разрядов:
h : = h 2;
h : = h V b
b = 0…01111111 = 28 – 1;
3) сравнение h c n. Если h < n, то выход из блока 1, в противном случае – сдвиг h на один разряд вправо.
h : = h 2
и переход к новому повторению пункта 3. Пункт 3 нужен для случая формирования первого шага для массива, по размеру меньшего чем 28 – 1 элемент.
Последующие шаги формируются путем сдвига на один разряд вправо кода предыдущего шага: h : = h 2
При этом обеспечивается некратный шаг на первых семи этапах процедуры, которых достаточно для требуемого выравнивания по составу всех формируемых последовательностей.