Slide 1

Slide 1 text

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 𝒏 • Оценка памяти 𝒏 • Стабильность Нет Особенности: • можно написать эффективную многопоточную сортировку слиянием; • сортировка данных, расположенных на периферийных устройствах и не вмещающихся в оперативную память.

Slide 16

Slide 16 text

16/24 16/24 Визуализация Сортировка слиянием Сортировка Шелла Быстрая сортировка Сортировка пузырьком Сортировка вставками

Slide 17

Slide 17 text

17/24 17/24 Как выбрать алгоритм сортировки Критерий Алгоритм Маленький массив Сортировка вставками Почти упорядоченный массив Сортировка вставками Важна работа в среднем Быстрая сортировка Нужно мало кода Сортировка вставками

Slide 18

Slide 18 text

8 октября 2021 [email protected] Анастасия Андреевна Корепанова Сортировки