
- •Лекция 13
- •План лекции
- •Задача сортировки
- •Устойчивая сортировка
- •Классификация алгоритмов сортировки
- •Сортировка включением
- •Пример
- •Программа
- •Анализ сортировки включением
- •Сортировка бинарными включениями
- •Сортировка выбором
- •Программа
- •Анализ сортировки выбором
- •Анализ сортировки выбором
- •Пирамидальная сортировка
- •Определение пирамиды
- •Макет пирамидальной сортировки
- •Макет пирамидальной сортировки
- •Просеивание
- •Построение пирамиды
- •Алгоритм пирамидальной сортировки
- •Просеивание
- •Пирамидальная сортировка
- •Анализ пирамидальной сортировки
- •Понятие сортировки
- •Сортировка простым обменом (пузырёк)
- •Пример
- •Алгоритм (метод пузырька)
- •Анализ
- •Улучшение метода пузырька
- •Шейкер-сортировка (алгоритм)
- •Шейкер-сортировка (продолжение)
- •Программа
- •Продолжение программы
- •Анализ
- •Сортировка подсчётом
- •Алгоритм (на одном массиве)
- •Сортировка с разделением
- •Сортировка разделением, идея алгоритма
- •Сортировка разделением (макет)
- •Анализ макета
- •Разделение массива
- •Процесс разделения
- •Комментарии
- •Комментарии
- •Комментарии
- •Процесс разделения, пример
- •Пример быстрой сортировки
- •Программа
- •Анализ
- •Нижняя граница числа сравнений в сортировке
- •Дерево решений для массива из 3 элементов
- •Для задачи сортировки в дереве решений N! листьев Значит, высота дерева решений log2(N)
- •Заключение
- •Анализ, продолжение
- •Анализ, продолжение
- •Алгоритм
- •Сортировка включениями с убывающим шагом. Метод Шелла
- •Пример работы сортировки Шелла
- •Пример работы сортировки Шелла, продолжение
- •Выбор шага в сортировке Шелла
- •Анализ эффективности метода
- •Алгоритм
- •Алгоритм, продолжение
- •Сортировка простым выбором
- •Пример
- •Обсуждение
- •Алгоритм
- •Пирамидальная сортировка
- •Сортировка, продолжение

Лекция 13
АЛГОРИТМЫ
СОРТИРОВКИ

План лекции
Понятие сортировки
Внутренняя и внешняя сортировка
Алгоритмы сортировки
Простые
Улучшенные
Анализ числа операций
Нижняя оценка числа операций в алгоритмах сортировки

Задача сортировки
Значения элементов массива (списка) делятся на ключ и произвольные данные
struct KeyData { K key; T data; };
Ключ можно рассматривать как значение функции T -> K, которая вычисляет ключ key на основании (сколь угодно сложного) анализа данных data
Сортировкой N объектов a[1], ..., а[N] называется нахождение перестановки p1, p2, …, pN, удовлетворяющей условиям
a[p1].key <= a[p2].key <= ... <= a[pN].key

Устойчивая сортировка
Сортировка называется устойчивой, если она не меняет порядок объектов с одинаковыми ключами
a[i].key = a[j].key и i < j => pi <
pj
где pi и pj – позиции a[i] и a[j] после сортировки

Классификация алгоритмов сортировки
По объёму данных
Внутренние
Все данные в памяти
Внешние
Часть данных на диске
По алгоритмическому приёму
Включение
Выбор
Обмен
Подсчет
Разделение
Слияние

Сортировка включением
Разделим элементы массива на неотсортированную часть a[i], ... , а[N] и отсортированную часть a[1], ... , а[i-1]
На i-м шаге i-й элемент неотсортированной части вставляется в подходящее место отсортированной части
Пусть 2 <= i <= N, a[1], ... , а[i-1] уже отсортированы
a[1] <= а[2] <= ... <= a[i-1]
Найдём max j от 1 до i-1 такой, что a[j] <= a[i]
Сдвинем a[j+1], ..., a[i-1] на одно место вправо и переместим запись а[i] в позицию j + 1

Пример
Процесс сортировки включениями покажем на примере последовательности, состоящей из восьми ключей:
i = 1 |
40 | 51 8 |
38 90 14 2 63 |
||
i = 2 |
40 51 | 8 |
38 |
90 14 2 63 |
|
i = 3 |
8 40 51 | 38 |
90 14 2 63 |
||
i = 4 |
8 38 40 51 | |
90 14 2 63 |
||
i = 5 |
8 38 40 51 |
90 | 14 2 63 |
||
i = 6 |
8 14 38 40 51 90 | 2 63 |
|||
i = 7 |
2 8 14 38 40 51 |
90 | 63 |
||
i = 8 |
2 8 14 38 40 51 |
63 90 | |

Программа
void sort_by_insertion(struct KeyData a[], int N)
{
int i;
for (i=1; i < N; i++) { struct KeyData x = a[i]; int j;
for (j=i-1;j>=0 && x.key<a[j].key; j--) a[j+1]= a[j];
a[j+1]=x;
}
}

Анализ сортировки включением
Для числа сравнений Сi во внутреннем цикле на i- м шаге внешнего цикла справедливо 1 <= Ci <= i
– 1
Для числа пересылок Mi во внутреннем цикле на i-м шаге внешнего цикла справедливо Мi = Сi + 2
Всего шагов внешнего цикла N - 1
Min и max число сравнений и пересылок в худшем и лучшем случаях
Cmin N 1, |
Cmax 1 2 ... N 1 |
N (N 1) |
, |
|
||||
|
|
|||||||
|
|
|
|
|
2 |
|
|
|
Mmin 2 (N 1), |
Mmax |
N (N 1) |
2 (N 1) |
|
N (N |
3) |
. |
|
2 |
|
|
||||||
|
|
|
|
2 |
|
|

Сортировка бинарными включениями
Если место для a[i] искать методом бинарного поиска в отсортированном массиве, то всего будет произведено ~ N*log2N сравнений
Почему?
Количество пересылок не изменится
Почему?