Алгоритмы сортировки. Лекция 4

Содержание

Слайд 2

Сортировка Фундаментальная алгоритмическая задача программирования Сортировка (общий случай) – процесс перегруппировки

Сортировка

Фундаментальная алгоритмическая задача программирования
Сортировка (общий случай) – процесс перегруппировки заданного множества

объектов в определенном порядке.
Алгоритм сортировки – алгоритм для упорядочения некоторого множества элементов (по убыванию, по возрастанию).
Ключ сортировки - атрибут (или несколько атрибутов), по значению которого определяется порядок элементов.
Применение сортировки:
Базы данных

Математические программы

Исходная последовательность

Отсортированная последовательность

A[i] <= A[i+1]

Условие сортировки

Ключ сортировки

Слайд 3

Алгоритм сортировки Практически любой алгоритм сортировки можно разбить на 3 части:

Алгоритм сортировки

Практически любой алгоритм сортировки можно разбить на 3 части:
сравнение, определяющее

упорядоченность пары элементов;
перестановку, меняющую местами пару элементов;
собственно сортирующий алгоритм, который осуществляет сравнение и перестановку элементов до тех пор, пока все элементы множества не будут упорядочены.
Слайд 4

Оценка алгоритмов сортировки Время сортировки Память Устойчивость Естественность поведения

Оценка алгоритмов сортировки

Время сортировки
Память
Устойчивость
Естественность поведения

Слайд 5

Классификация сортировок По различным признакам: по количеству использований операций сравнения по

Классификация сортировок

По различным признакам:
по количеству использований операций сравнения
по потребности в дополнительной

памяти
по устойчивости
по потребности в знаниях о структуре данных
Наиболее часто и подробно рассматривают классификацию алгоритмов сортировки на внутренние и внешние.
Слайд 6

Внутренняя и внешняя сортировка Внутренняя сортировка (англ. internal sort) — сортировка

Внутренняя и внешняя сортировка

Внутренняя сортировка (англ. internal sort) — сортировка данных,

при которой оперативной памяти достаточно для помещения в неё сортируемого массива данных с произвольным доступом к любой ячейке и собственно для выполнения алгоритма.
сортировка происходит максимально быстро, т. к. время обращения к периферийным устройствам значительно выше чем к оперативной памяти.
является базовой для любого алгоритма внешней сортировки - отдельные части массива данных сортируются в оперативной памяти и с помощью специального алгоритма сцепляются в один массив, упорядоченный по ключу.
Внешняя сортировка - сортировка данных, расположенных на периферийных устройствах и не вмещающихся в оперативную память.
используют для обработки больших списков данных, которые не помещаются в оперативную память.
последовательный доступ к данным, расчленение данных на части последовательно помещающихся и обрабатываемых в оперативной памяти.
используют внешнюю память (как правило, жесткие и гибкие диски, магнитные ленты).
используется в СУБД (большие объемы информации)
Слайд 7

Различия м\у внеш. и внутр. сортировкой Когда используются методы внутренней сортировки:

Различия м\у внеш. и внутр. сортировкой

Когда используются методы внутренней сортировки:
Если сортируемый

файл с данными целиком помещается в память
Когда используются методы внешней сортировки:
Если сортируемый файл целиком не помещается в оперативную память, т.е. сортировка данных требует разбиения данных на большие блоки, которые одновременно не находятся в оперативной памяти,
или же сортировка происходит последовательным образом с ленты или диска то, такая сортировка называется внешней сортировкой.
Внутренняя сортировка значительно эффективней внешней, так как на обращение к оперативной памяти затрачивается намного меньше времени, чем к внешним запоминающим устройствам.
Слайд 8

Алгоритмы сортировок Алгоритмы внутренней сортировки (элементарные методы) Сортировка выбором Сортировка вставкой

Алгоритмы сортировок

Алгоритмы внутренней сортировки (элементарные методы)
Сортировка выбором
Сортировка вставкой
Пузырьковая сортировка

Алгоритмы внутренней сортировки

(усовершенствованные)
Пирамидальная сортировка
Сортировка методом Шелла
Быстрая сортировка Хоара
Разделяющая сортировка

Алгоритмы внешней сортировки
Прямое слияние (двухпутевое слияние)
Естественное слияние
Многопутевое слияние (n-путевое слияние)

Слайд 9

Раздел Алгоритмы внутренней сортировки

Раздел Алгоритмы внутренней сортировки

Слайд 10

Внутренняя сортировка Квадратичные и субквадратичные алгоритмы Сортировка выбором (SelectSort) Сортировка пузырьком

Внутренняя сортировка

Квадратичные и субквадратичные алгоритмы
Сортировка выбором (SelectSort)
Сортировка пузырьком (BubbleSort) и ее

улучшения
Сортировка простыми вставками (InsertSort)
Cортировка методом Шелла (ShellSort)

Логарифмические и линейные алгоритмы
Бинарная пирамидальная сортировка (HeapSort)
Быстрая сортировка Хоара (QuickSort)

Слайд 11

Сортировка выбором Шаги алгоритма: Находим минимальное значение в текущей последовательности. Производим

Сортировка выбором

Шаги алгоритма:
Находим минимальное значение в текущей последовательности.
Производим обмен этого значения

со значением на первой неотсортированной позиции.
Сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы.
Слайд 12

Метод сортировки выбором Неестественнен Неустойчив

Метод сортировки выбором

Неестественнен

Неустойчив

Слайд 13

Еще пример сортировки выбором Шаги алгоритма: Находим минимальное значение в текущей

Еще пример сортировки выбором

Шаги алгоритма:
Находим минимальное значение в текущей последовательности.
Производим обмен

этого значения со значением на первой неотсортированной позиции.
Сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы.
Слайд 14

Код сортировка выбором

Код сортировка выбором

Слайд 15

Сортировка пузырьком

Сортировка пузырьком

Слайд 16

Код сортировки пузырьком Сложность O(n2)

Код сортировки пузырьком

Сложность O(n2)

Слайд 17

Модификации сортировки пузырьком Улучшение 1: запоминать производился ли на данном проходе

Модификации сортировки пузырьком

Улучшение 1: запоминать производился ли на данном проходе какой-либо

обмен
Улучшение 2: запоминать индекс последнего обмена k.
Улучшение 3: менять направление следующих один за другим проходов: "шейкер-сортировка"

2 3 4 5 6 1

6 1 2 3 4 5

Слайд 18

Сортировка пузырьком Выводы Среднее (оно же худшее) количество операций остается квадратичным. Дополнительная память, очевидно, не требуется

Сортировка пузырьком Выводы

Среднее (оно же худшее) количество операций остается квадратичным.
Дополнительная память, очевидно,

не требуется
Слайд 19

«Шейкер-сортировка»

«Шейкер-сортировка»

Слайд 20

Глупая сортировка Сложность O(n3)

Глупая сортировка

Сложность O(n3)

Слайд 21

Сортировка вставками

Сортировка вставками

Слайд 22

Код сортировки вставками Сложность O(n2)

Код сортировки вставками

Сложность O(n2)

Слайд 23

Сортировка вставками со сторожевым элементом

Сортировка вставками со сторожевым элементом

Слайд 24

Сортировка методом Шелла Общая схема метода состоит в следующем. Шаг 1.

Сортировка методом Шелла

Общая схема метода состоит в следующем.
Шаг 1. Происходит упорядочивание

элементов n/2 пар (xi,xn/2+i) для 1Шаг 2. Упорядочиваются элементы в n/4 группах из четырех элементов (xi,xn/4+i,xn/2+i,x3n/4+i) для 1Шаг 3. Упорядочиваются элементы уже в n/4 группах из восьми элементов и т.д.
На последнем шаге упорядочиваются элементы сразу во всем массиве x1,x2,...,xn.
На каждом шаге для упорядочивания элементов в группах используется метод сортировки вставками
Слайд 25

Сортировка Шелла Шаг 0: исходный массив Шаг 1: сортируем вставками 8

Сортировка Шелла

Шаг 0: исходный массив

Шаг 1: сортируем вставками
8 групп по

2 элемента

Шаг 2: сортируем вставками
4 групп по 4 элемента

Шаг 3: сортируем вставками
2 групп по 8 элемента

Шаг 4: сортируем вставками
1 групп из 16 элементов

Сложность O(n3/2)

Слайд 26

Модификации сортировки методом шелла (Седжвик) 8, 4, 2, 1 inc[s-1], если

Модификации сортировки методом шелла (Седжвик)

8, 4, 2, 1

inc[s-1], если 3*inc[s] >

size,…, 41, 19, 5, 1

Сложность: средний O(n7/6), худший O(n4/3)

Слайд 27

Код сортировки методом Шелла + Седжвик

Код сортировки методом Шелла + Седжвик

Слайд 28

Пример сортировка методом Шелла Демонстрация сортировки по неубыванию методом Шелла Альтернативная реализация сортировки методом Шелла

Пример сортировка методом Шелла

Демонстрация сортировки по неубыванию методом Шелла

Альтернативная реализация сортировки методом

Шелла
Слайд 29

Сравнение времени сортировок коричневая линия: сортировка пузырьком; синяя линия: шейкер-сортировка; розовая

Сравнение времени сортировок
коричневая линия: сортировка пузырьком;
синяя линия: шейкер-сортировка;
розовая линия: сортировка выбором;
желтая

линия: сортировка вставками;
голубая линия: сортировка вставками со сторожевым элементом;
фиолетовая линия: сортировка Шелла.
Слайд 30

Сложность O(n*log n) Сложность O(n2) Пирамидальная сортировка Сортировка выбором Вспомогательная структура,

Сложность O(n*log n)

Сложность O(n2)

Пирамидальная сортировка

Сортировка выбором

Вспомогательная структура, позволяющая выбирать максимальный элемент

последовательности не за O(n), а за O(log n) времени
Слайд 31

Пирамида Пирамида (сортирующее дерево, двоичная куча) – двоичное дерево с упорядоченными

Пирамида

Пирамида (сортирующее дерево, двоичная куча) – двоичное дерево с упорядоченными листьями

(корень дерева – наименьший или наибольший элемент) [осн.условие каждый элемент меньше, либо равен родителю
Слайд 32

Просеивание Просеивание – это построение новой пирамиды по следующему алгоритму: новый

Просеивание

Просеивание – это построение новой пирамиды по следующему алгоритму: новый элемент

помещается в вершину дерева, далее он перемещается ("просеивается") по пути вниз на основе сравнения с дочерними элементами. Спуск завершается, если результат сравнения с дочерними элементами соответствует ключу сортировки.
Слайд 33

Алгоритм пирамидальной сортировки Алгоритм пирамидальной сортировки. Шаг 1. Преобразовать массив в

Алгоритм пирамидальной сортировки

Алгоритм пирамидальной сортировки.
Шаг 1. Преобразовать массив в пирамиду.
Шаг 2.

Использовать алгоритм сортировки пирамиды.
Слайд 34

Фаза 1. пирамидальной сортировки Построение пирамиды Шаг.1 Шаг.2 Шаг.3 Шаг.4 Шаг.5

Фаза 1. пирамидальной сортировки Построение пирамиды

Шаг.1

Шаг.2

Шаг.3

Шаг.4

Шаг.5

Слайд 35

Код фазы 1. построение пирамиды

Код фазы 1. построение пирамиды

Слайд 36

Фаза 2. Сортировка Алгоритм фазы 2: Меняем местами верхний и последний

Фаза 2. Сортировка

Алгоритм фазы 2:
Меняем местами верхний и последний элементы
«Забываем» про

последний элемент
«Просеиваем новый верхний элемент для того, чтобы получить пирамиду
Повторяем.
Слайд 37

Код фазы 2. сортировка

Код фазы 2. сортировка

Слайд 38

Альтернативный код пирамидальной сортировки

Альтернативный код пирамидальной сортировки

Слайд 39

Характеристики пирамидальной сортировки Построение пирамиды занимает O(n log n) Не использует

Характеристики пирамидальной сортировки

Построение пирамиды занимает O(n log n)
Не использует дополнительной памяти
Метод

не является устойчивым
Поведение неестественно
Слайд 40

Быстрая сортировка Хоара Дан массив x[n] размерности n. Шаг 1. Выбирается

Быстрая сортировка Хоара

Дан массив x[n] размерности n.
Шаг 1. Выбирается опорный элемент

массива.
Шаг 2. Массив разбивается на два – левый и правый – относительно опорного элемента. Реорганизуем массив таким образом, чтобы все элементы, меньшие опорного элемента, оказались слева от него, а все элементы, большие опорного – справа от него.
Шаг 3. Далее повторяется шаг 2 для каждого из двух вновь образованных массивов. Каждый раз при повторении преобразования очередная часть массива разбивается на два меньших и т. д., пока не получится массив из двух элементов.
Слайд 41

Алгоритм (псевдокод)

Алгоритм (псевдокод)

Слайд 42

Код быстрой сортировки Хоара

Код быстрой сортировки Хоара

Слайд 43

Пример

Пример

Слайд 44

Пример быстрой сортировки (не симметричный вариант) 0. 0 1 2 3

Пример быстрой сортировки (не симметричный вариант)

0.

0

1

2

3

4

5

6

7

1.

2.

3.

Слайд 45

Важно 0. 1. 2.

Важно

0.

1.

2.

Слайд 46

Быстрая сортировка Общая схема: из массива выбирается некоторый опорный элемент a[i],

Быстрая сортировка

Общая схема:
из массива выбирается некоторый опорный элемент a[i],
запускается процедура

разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] - вправо,
теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого,
для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру.
Слайд 47

Алгоритм быстрой сортировки На входе массив a[0]...a[N] и опорный элемент p,

Алгоритм быстрой сортировки

На входе массив a[0]...a[N] и опорный элемент p, по

которому будет производиться разделение.
Введем два указателя: i и j [указывают, соответственно, на левый и правый конец последовательности].
Двигаем указатель i с шагом в 1 элемент по направлению к концу массива, пока не будет найден элемент a[i] >= p. Двигаем указатель j от конца массива к началу, пока не будет найден a[j] <= p.
Далее, если i <= j, меняем a[i] и a[j] местами и продолжаем двигать i,j по тем же правилам...
Повторяем шаг 3, пока i <= j.
Слайд 48

Пример быстрой сортировки (симметричный вариант) Псевдокод. quickSort ( массив a, верхняя

Пример быстрой сортировки (симметричный вариант)

Псевдокод.
quickSort ( массив a, верхняя граница N )


{
Выбрать опорный элемент p - середину массива
Разделить массив по этому элементу
Если подмассив слева от p содержит более одного элемента,
вызвать quickSort для него.
Если подмассив справа от p содержит более одного элемента,
вызвать quickSort для него.
}
Слайд 49

Код быстрой сортировки

Код быстрой сортировки

Слайд 50

Характеристики быстрой сортировки Быстродействие: Средний случай: O(n log n) Худший случай:

Характеристики быстрой сортировки

Быстродействие:
Средний случай: O(n log n)
Худший случай: O(n2)
Использует дополнительную память
Метод неустойчив.
Поведение

естественно.
Слайд 51

Сортировка слиянием Слияние – это объединение двух или более упорядоченных массивов

Сортировка слиянием

Слияние – это объединение двух или более упорядоченных массивов в

один упорядоченный.
Алгоритм сортировки слиянием
Шаг 1. Разбить имеющиеся элементы массива на пары и осуществить слияние элементов каждой пары, получив отсортированные цепочки длины 2 (кроме, быть может, одного элемента, для которого не нашлось пары).
Шаг 2. Разбить имеющиеся отсортированные цепочки на пары, и осуществить слияние цепочек каждой пары.
Шаг 3. Если число отсортированных цепочек больше единицы, перейти к шагу 2.
Слайд 52

Пример Демонстрация сортировки слиянием по неубыванию

Пример

Демонстрация сортировки слиянием по неубыванию

Слайд 53

Код сортировки слияние Сложность O(n*log n) Расходует дополнительную память. Не устойчив.

Код сортировки слияние

Сложность O(n*log n)

Расходует дополнительную память.
Не устойчив.

Слайд 54

Иллюстрация работы разных алгоритмов сортировки www.sorting-algorithms.com/

Иллюстрация работы разных алгоритмов сортировки

www.sorting-algorithms.com/

Слайд 55

Алгоритмы сортировки Сортировка пузырьком (англ. Bubble sort ) — сложность алгоритма:

Алгоритмы сортировки

Сортировка пузырьком (англ. Bubble sort ) — сложность алгоритма: O(n2); для каждой пары индексов

производится обмен, если элементы расположены не по порядку.
Сортировка перемешиванием (Шейкерная, Cocktail sort, bidirectional bubble sort) — Сложность алгоритма: O(n2)
Гномья сортировка — имеет общее с сортировкой пузырьком и сортировкой вставками. Сложность алгоритма — O(n2).
Сортировка вставками (Insertion sort) — Сложность алгоритма: O(n2); определяем где текущий элемент должен находиться в упорядоченном списке и вставляем его туда
Блочная сортировка (Корзинная сортировка, Bucket sort) — Сложность алгоритма: O(n); требуется O(k) дополнительной памяти и знание о природе сортируемых данных, выходящее за рамки функций "переставить" и "сравнить".
Сортировка подсчётом (Counting sort) — Сложность алгоритма: O(n+k); требуется O(n+k) дополнительной памяти (рассмотрено 3 варианта)
Сортировка слиянием (Merge sort) — Сложность алгоритма: O(n log n); требуется O(n) дополнительной памяти; выстраиваем первую и вторую половину списка отдельно, а затем — сливаем упорядоченные списки
Сортировка с помощью двоичного дерева (англ. Tree sort) — Сложность алгоритма: O(n log n); требуется O(n) дополнительной памяти
Слайд 56

Раздел Алгоритмы внешней сортировки

Раздел Алгоритмы внешней сортировки

Слайд 57

Алгоритмы внешней сортировки Прямое слияние Естественное слияние Многопутевое слияние Трехпутевое слияние

Алгоритмы внешней сортировки

Прямое слияние
Естественное слияние
Многопутевое слияние
Трехпутевое слияние

Слайд 58

Прямое слияние Предположим, что имеется последовательный файл A, состоящий из записей

Прямое слияние

Предположим, что имеется последовательный файл A, состоящий из записей a1,

a2, ..., an.
Для сортировки используются два вспомогательных файла B и C (размер каждого из них будет n/2).
Последовательность шагов алгоритма:
Шаг 1. Разбить имеющиеся элементы массива на пары и осуществить слияние элементов каждой пары, получив отсортированные цепочки длины 2 (кроме, быть может, одного элемента, для которого не нашлось пары).
Шаг 2. Разбить имеющиеся отсортированные цепочки на пары, и осуществить слияние цепочек каждой пары.
Шаг 3. Если число отсортированных цепочек больше единицы, перейти к шагу 2.
Слайд 59

Прямое слияние (шаг 1) В файле A хранятся числа: 8, 23,

Прямое слияние (шаг 1)

В файле A хранятся числа: 8, 23, 5,

65, 44, 33, 1, 6
Слайд 60

Прямое слияние (шаг 2)

Прямое слияние (шаг 2)

Слайд 61

Прямое слияние (шаг 3) Часть 1 Часть 2

Прямое слияние (шаг 3)

Часть 1

Часть 2

Слайд 62

Особенности прямого слияния В основной памяти требуется расположить всего лишь две

Особенности прямого слияния

В основной памяти требуется расположить всего лишь две переменные

- для размещения очередных записей из файлов B и C.
Файлы A, B и C будут O(log n) раз прочитаны и столько же раз записаны.
8 элементов – 3 операции чтения-записи
16 элементов – 4 операции чтения-записи
1024 элемента – 10 операции чтения-записи
Слайд 63

Естественное слияние При использовании метода прямого слияния не принимается во внимание

Естественное слияние

При использовании метода прямого слияния не принимается во внимание то,

что исходный файл может быть частично отсортированным, т.е. содержать серии.
Серией - отсортированная подпоследовательность записей.
Метод естественного слияния основывается на распознавании серий при распределении и их использовании при последующем слиянии.
Слайд 64

Естественное слияние (шаг 1)

Естественное слияние (шаг 1)

Слайд 65

Естественное слияние (шаг 2)

Естественное слияние (шаг 2)

Слайд 66

Особенности естественного слияния Число чтений/перезаписей файлов при использовании этого метода будет

Особенности естественного слияния

Число чтений/перезаписей файлов при использовании этого метода будет не

хуже, чем при применении метода прямого слияния, а в среднем - лучше.
С другой стороны, увеличивается число сравнений за счет тех, которые требуются для распознавания концов серий. Кроме того, поскольку длина серий может быть произвольной, то максимальный размер файлов B и C может быть близок к размеру файла A.
Количество операций чтения-записи - O(log n)
Слайд 67

Многопутевое слияние Процесс многопутевого слияния происходит также как и процесс простого

Многопутевое слияние

Процесс многопутевого слияния происходит также как и процесс простого прямого

(двухпутевого) слияния.
Единственное отличие: в слиянии участвуют несколько файлов, содержащие отсортированные серии.
Слайд 68

Трехпутевое слияние

Трехпутевое слияние

Слайд 69

Трехпутевое слияние Шаг 4 Шаг 5

Трехпутевое слияние

Шаг 4

Шаг 5

Слайд 70

Трехпутевое слияние Шаг 6

Трехпутевое слияние

Шаг 6

Слайд 71

Сбалансированное многопутевое слияние В основе метода внешней сортировки сбалансированным многопутевым слиянием

Сбалансированное многопутевое слияние

В основе метода внешней сортировки сбалансированным многопутевым слиянием является

распределение серий исходного файла по m вспомогательным файлам B1, B2, ..., Bm и их слияние в m вспомогательных файлов C1, C2, ..., Cm. На следующем шаге производится слияние файлов C1, C2, ..., Cm в файлы B1, B2, ..., Bm и т.д., пока в B1 или C1 не образуется одна серия.
Слайд 72

Многопутевое слияние По мере увеличения длины серий вспомогательные файлы с большими

Многопутевое слияние

По мере увеличения длины серий вспомогательные файлы с большими номерами

(начиная с номера n) перестают использоваться, поскольку им "не достается" ни одной серии.
Число проходов алгоритма оценивается как O(logan)
n - число записей в исходном файле
a - количество вспомогательных файлов.
Если файлов 2 то основание 2
Если файлов 3 то основание 3
Слайд 73

Улучшение эффективности внешней сортировки Чем более длинные серии содержит файл перед

Улучшение эффективности внешней сортировки

Чем более длинные серии содержит файл перед началом

применения внешней сортировки, тем меньше потребуется слияний и тем быстрее закончится сортировка.
До начала применения любого из методов внешней сортировки, основанных на применении серий, начальный файл частями считывается в основную память, к каждой части применяется один из алгоритмов внутренней сортировки и отсортированные части (образующие серии) записываются в новый файл.