
- •Лабораторная работа №9.
- •1. Теоретические сведения:
- •1.1. Методы сортировки
- •1.2. Сортировки массивов
- •2. Сортировки обменом
- •2.1. Сортировка простым обменом (метод пузырька)
- •2.2. Сортировка простым обменом с флагом
- •2.3. Сортировка простым обменом с границей
- •2.4. Шейкер-сортировка
- •2.5. Быстрая сортировка
- •3. Сортировки включениями
- •3.1. Сортировка простым включением
- •3.2. Сортировка бинарными вставками
- •3.3. Сортировка Шелла
- •4. Сортировки выбором
- •4.1. Сортировка простым выбором
- •4.2. Пирамидальная сортировка
- •5. Сравнительный анализ сортировок
- •6. Контрольные вопросы
2.2. Сортировка простым обменом с флагом
Идея: этот метод является оптимизацией предыдущего метода – нужно запомнить, проводился ли при данном просмотре какой-нибудь обмен, и если нет, то можно досрочно завершить работу.
2.3. Сортировка простым обменом с границей
Идея: нужно запомнить не только факт обмена, но и запомнить индекс последнего обмена, так как понятно, что все пары соседних элементов с индексами меньшими этого индекса уже размещены в нужном порядке. Поэтому просмотр можно заканчивать на этом индексе вместо того, чтобы двигаться до конца.
2.4. Шейкер-сортировка
Следующий пример: 94, 55, 10, 12, 08, 44, 06, 67 (n=8) демонстрирует такое свойство, что при просмотре слева направо легкий элемент с каждым разом сдвигается на один шаг, а тяжелый сразу попадает в конец.
1-й просмотр: 55, 10, 12, 08, 44, 06, 67, 94
2-й просмотр: 10, 12, 08, 44, 06, 55, 67, 94
3-й просмотр: 10, 08, 12, 06, 44, 55, 67, 94
Отсюда сразу виден следующий подход.
Идея: используем смену направлений просмотра (→,←), поскольку один плохо размещенный «пузырек», «тяжелый» в «легком» конце, будет опускаться на нужное место за один проход, а «легкий» пузырек в «тяжелом» конце будет опускаться каждый раз только на один шаг.
Пример:
а) 94, 06, 12, 18, 42, 44, 55, 67; просмотр → сортирует массив за 1 проход;
б) 12, 18, 42, 44, 55, 67, 94, 06; тут понадобилось бы 7 проходов.
Схема работы алгоритма:
{1-й проход «←»}
i:=n..2; id
– индекс последней перестановки, значит
уже упорядочен;
{2-й проход «→»}
left:=id;
i:=left..n;
id – индекс последней
перестановки,
– осталось упорядочить. И так далее.
2.5. Быстрая сортировка
Рассмотрим последовательность элементов, отсортированных в обратном порядке. Как их быстро отсортировать в нужном порядке? Правильно, нужно выполнить обмен равноудаленных от концов элементов. Это наводит на определенные мысли, и получается такой улучшенный алгоритм:
Идея: выбираем
некоторый элемент x
данных – опорный элемент. Двигаемся по
совокупности элементов слева направо,
пока не встретим элемент
,
а потом – справа налево, пока не найдем
элемент
.
Если i<j,
то обменяем
и
.
Продолжаем просмотр далее от позиции
i+1 до j-1.
Выполняем такой поиск до тех пор, пока
два просмотра не встретятся.
Пусть в следующем примере: 55, 12, 42, 94, 06, 18, 44, 67 опорный элемент равен 42. Получим такую последовательность перемещений:
55, 12, 42, 94, 06, 18, 44, 67;
18, 12, 42, 94, 06, 55, 44, 67;
18, 12, 06 | 94, 42, 55, 44, 67.
Дальше просмотр слева направо заканчивается на элементе 94, а справа налево на элементе 6. Они не обмениваются. Получили две части последовательности:
В одной числа меньшие, чем x
Во второй числа не меньшие, чем x
Поделив массив опорным элементом на две части, нужно сделать то же самое с каждой из них, а затем с частями этих частей и т.д., пока каждая часть не будет содержать только один элемент.
3. Сортировки включениями
3.1. Сортировка простым включением
Идея: элементы
условно разделяются на готовую
последовательность
и входящую последовательность
.
На каждом шаге, начиная с i=2,3,…,
берут
и вставляют его на подходящее место в
готовую последовательность.
Готовая последовательность упорядочена в порядке роста. Элемент x нужно вставить в нее не нарушая порядок, например, «просеять». Заметим, что «просеивание» может закончиться при двух условиях:
Найден элемент
такой, что
,
;
Достигли левого конца готовой последовательности.
Когда становится
ясно, куда нужно вставить элемент x,
нужно освободить для него место, перемещая
элементы
на шаг вправо. Отметим, что это перемещение
можно выполнять сразу при сравнении.