8 октября 2021
[email protected]
Анастасия Андреевна Корепанова
Сортировки
Slide 2
Slide 2 text
2/24
2/24
Постановка задачи 1/2
• Исходные данные – последовательность чисел 𝑎1
, 𝑎2
, … 𝑎𝑛
.
Результат – последовательность 𝑎1
′ , 𝑎2
′ , … 𝑎𝑛
′ , состоящая из
тех же чисел, идущих в неубывающем порядке.
Slide 3
Slide 3 text
3/24
3/24
Постановка задачи 2/2
• Сортировать числа
1, 2, 3, 15, 20, 34…
• Сортировать строки
A, AA, AB, ABC, …
• Сортировать типы данных (по выделяемой памяти)
char, short, int, double, …
Slide 4
Slide 4 text
4/24
4/24
Свойства сортировок
• Есть понятие «ключ».
• Устойчивость — сохраняется ли взаимное расположение
элементов с одинаковым ключом
• Естественность — эффективность метода при обработке уже
упорядоченных или частично упорядоченных данных. Алгоритм
ведёт себя естественно, если учитывает эту характеристику
входной последовательности и работает лучше.
• Внутренняя сортировка — работает над данными, целиком
помещающимися в память
• Внешняя сортировка работает над данными на устройствах с
последовательным доступом, которые медленнее, чем память
• Сложность
Slide 5
Slide 5 text
5/24
5/24
Сортировка пузырьком 1/2
Идея метода: шаг сортировки состоит в проходе снизу вверх по массиву. По пути
просматриваются пары соседних элементов. Если элементы некоторой пары
находятся в неправильном порядке, то меняем их местами. Варианты остановки
алгоритма: после N-1 проходов; если за проход не было сделано ни одной
перестановки
function bubbleSort(a):
for i = 0 to n - 2
for j = 0 to n - 2
if a[j] > a[j + 1]
swap(a[j], a[j + 1])
Первый проход:
(5 1 4 2 8) (1 5 4 2 8),
(1 5 4 2 8) (1 4 5 2 8),
(1 4 5 2 8) (1 4 2 5 8),
(1 4 2 5 8) (1 4 2 5 8),
Второй проход:
(1 4 2 5 8) (1 4 2 5 8),
(1 4 2 5 8) (1 2 4 5 8),
(1 2 4 5 8) (1 2 4 5 8),
Третий проход:
(1 2 4 5 8) (1 2 4 5 8)
(1 2 4 5 8) (1 2 4 5 8)
Slide 6
Slide 6 text
6/24
6/24
Сортировка пузырьком 2/2
• Лучший случай –
• Худший случай –
• Оценка памяти –
• Устойчивость –
• Естественность –
Особенности: мало кода, быстро реализуется
𝒏
𝒏𝟐
Да
1
Да
Slide 7
Slide 7 text
7/24
7/24
Сортировка вставками 1/2
Общая суть сортировок вставками такова:
1. Перебираются элементы в неотсортированной части массива.
2. Каждый элемент вставляется в отсортированную часть массива на то
место, где он должен находиться.
Slide 8
Slide 8 text
8/24
8/24
Сортировка вставками 2/2
• Особенности:
лучшее решение для
почти упорядоченных
массивов
• Лучший случай
• Худший случай
• Оценка памяти
• Устойчивость
• Естественность
Процедура InsertionSort(A: массив, min - начальный индекс, max - конечный индекс);
Начало
Цикл для i от min+1 до max
j=i
tmp=Ai
; //запоминаем значение ещё неотсортированного элемента
цикл пока (j>min и Aj-1
>tmp): //Сравниваем очередной отсортированный элемент, если он
больше,
1. Aj
=Aj-1
//то сдвигаем его в большую сторону, освобождая место для вставки
2. j=j-1 //Переходим к следующему элементу в отсортированной части массива
Aj
=tmp; //Место для нового элемента определено - вставляем его туда
Конец процедуры
𝒏
𝒏𝟐
Да
1
Да
Slide 9
Slide 9 text
9/24
9/24
Сортировка Шелла
Основана на сравнении элементов массива,
расположенных на определенном расстоянии друг
от друга, которое постепенно уменьшается до 1.
Slide 10
Slide 10 text
10/24
10/24
Сортировка Шелла: выбор шага
Теоретикам не удалось найти оптимальную схему выбора шагов. Дональд
Кнут провел множество экспериментов и нашел следующую формулу
выбора шагов h для массива длины N:
в последовательности ℎ1
= 1, ℎ𝑠+1
+ 1 = 3ℎ𝑠
+ 1, ...
взять ℎ𝑡, если ℎ𝑡+2
≥ 𝑁.
Вот несколько первых значений h:
h
1
= 1
h
2
= (3 x 1) + 1 = 4
h
3
= (3 x 4) + 1 = 13
h
4
= (3 x 13) + 1 = 40
h
5
= (3 x 40) + 1 = 121
Slide 11
Slide 11 text
11/24
11/24
Сортировка Шелла
• Лучший случай 𝒏 log2 𝒏
• Худший случай 𝒏𝟑/𝟐
• Оценка памяти 1
• Устойчивость Нет
• Естественность
Особенности: мало кода, довольно быстра, не вырождается до квадратичной.
Шаг 0. 𝑖 = 𝑡
Шаг 1. Разобьем массив на списки элементов, отстающих
друг от друга на ℎ𝑖
. Таких списков будет ℎ𝑖
.
Шаг 2. Отсортируем элементы каждого списка сортировкой
вставками.
Шаг 3. Объединим списки обратно в массив. Уменьшим 𝑖.
Если 𝑖 неотрицательно — вернемся к шагу 1
Конец.
Slide 12
Slide 12 text
12/24
12/24
Быстрая сортировка 1/2
Метод основан на подходе «разделяй-и-властвуй».
Общая схема такова:
1. из массива выбирается некоторый опорный элемент a[i]
(идеально – медиана, но её вычисление слишком трудоёмко для сортировки).
2. запускается процедура разделения массива, которая перемещает все ключи,
меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i]
– вправо.
3. теперь массив состоит из двух подмножеств, причем левое меньше, либо
равно правого
4. для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно
запускаем для него ту же процедуру.
В конце получится полностью отсортированная последовательность.
Slide 13
Slide 13 text
13/24
13/24
Быстрая сортировка 2/2
• Лучший случай 𝒏 log 𝒏
• Средний случай 𝒏 log 𝒏
• Худший случай 𝒏𝟐
• Оценка памяти log 𝒏
• Устойчивость Нет
• Естественность Нет
Быстрая сортировка является наиболее широко применяемым и одним их самых
эффективных алгоритмов, обычно лежит в основе библиотечных реализаций
сортировок.
Slide 14
Slide 14 text
14/24
14/24
Сортировка слиянием 1/2
Алгоритм использует принцип «разделяй и властвуй»:
задача разбивается на подзадачи меньшего размера, которые решаются по
отдельности, после чего их решения комбинируются для получения решения исходной
задачи.
1. Если в рассматриваемом массиве один элемент, то он уже отсортирован —
алгоритм завершает работу.
2. Иначе массив разбивается на две части, которые сортируются рекурсивно.
3. После сортировки двух частей массива к ним применяется процедура слияния,
которая по двум отсортированным частям получает исходный отсортированный
Slide 15
Slide 15 text
15/24
15/24
Сортировка слиянием 2/2
• Лучший случай 𝒏 log 𝒏
• Средний случай 𝒏 log 𝒏
• Худший случай 𝒏 log 𝒏
• Оценка памяти 𝒏
• Стабильность Нет
Особенности:
• можно написать эффективную многопоточную сортировку слиянием;
• сортировка данных, расположенных на периферийных устройствах и
не вмещающихся в оперативную память.
17/24
17/24
Как выбрать алгоритм сортировки
Критерий Алгоритм
Маленький массив Сортировка вставками
Почти упорядоченный массив Сортировка вставками
Важна работа в среднем Быстрая сортировка
Нужно мало кода Сортировка вставками
Slide 18
Slide 18 text
8 октября 2021
[email protected]
Анастасия Андреевна Корепанова
Сортировки