Профессиональная этика и этикет на государственной службе
Алгоритмы сортировки
1. РОССИЙСКАЯ АКАДЕМИЯ НАРОДНОГО ХОЗЯЙСТВА И
ГОСУДАРСТВЕННОЙ СЛУЖБЫ ПРИ ПРЕЗИДЕНТЕ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Нижегородский институт управления
Кафедра информатики и информационных технологий
Введение в алгоритмы и
структуры данных
Ивина Наталья Львовна
доцент кафедры Информатики и ИТ
2. Тема 3. Алгоритмы сортировки
Общие понятия. Цель сортировки.
Внутренняя и внешняя сортировки.
Сортировка методом прямого обмена (сортировка методом
пузырька).
Шейкерная сортировка.
Сортировка методом прямого выбора. Сортировка методом
прямого включения. Сортировка методом Шелла.
Быстрая сортировка.
Сортировка слиянием упорядоченных массивов.
2
3. Введение
Сортировка - процесс упорядочения множества подобных
информационных объектов в порядке возрастания или убывания
их значений.
Цель сортировки - упорядочивание данных для облегчения
последующего поиска элементов в отсортированном множестве.
3
4. Характеристики алгоритмов
сортировки:
• Устойчивость – изменение относительного положения равных
элементов (метод сортировки устойчивый, если при его
применении не изменяется относительное положение записей с
равными значениями ключа)
• Естественность поведения – улучшение работы алгоритма при
улучшении (частичной или полной сортировке) входных данных
• Сравнения - количество операций сравнения элементов
• Перестановки - количество перестановок элементов
4
5. Виды сортировки:
• внутренняя сортировка - сортировка массивов записей,
целиком расположенных в оперативной памяти;
• внешняя сортировка - сортировка файлов, хранящихся во
внешней памяти и не помещающихся полностью в оперативной
памяти.
5
7. Оценка алгоритмов сортировки:
• С какой средней скоростью алгоритм сортирует информацию?
• Какова скорость для лучшего случая и для худшего случая?
• Поведение алгоритма является естественным или является не
естественным?
• Выполняется ли перестановка элементов для одинаковых
ключей?
7
8. Сортировка методом прямого
обмена (сортировка методом
пузырька)
Нулевой проход сортировки, сравниваемые пары выделены.
8
9. Сортировка методом прямого
обмена (сортировка методом
пузырька)
Состояние массива в начале каждого прохода.
9
10. Сортировка методом
прямого обмена (сортировка
методом пузырька)
Оценка сложности
n - число сортируемых элементов массива
внешний цикл выполняется (n-1) раз;
внутренний цикл выполняется n/2 раз
Число операций сравнения: (n2-n)/2 - ВСЕГДА!
Число операций обмена:
наилучший случай - 0,
средний случай - 3/4 (n2-n),
наихудший случай - 3/2 (n2-n)
Сложность: О(n2)
10
11. Шейкерная (челночная)
сортировка
Улучшенная версия сортировки пузырьковым методом
Состояние массива в начале каждого прохода.
11
12. Число сравнений не изменяется - (n2-n)/2,
число обменов уменьшается лишь на незначительную
величину.
Сложность О(n2)
Шейкерная (челночная)
сортировка. Оценка сложности
12
13. Сортировка методом
прямого выбора
На i-м шаге выбираем наименьший из элементов a[i] ... a[n] и
меняем его местами с a[i].
Последовательность шагов при n=5:
Вне зависимости от номера текущего шага i, последовательность
a[0]...a[i] (выделена курсивом) является упорядоченной.
13
14. Сортировка методом прямого
выбора. Оценка сложности
Алгоритм делает n-1 итераций, на каждой из которых
осуществляется еще n-i проходов (сравнений) и одна
перестановка.
Внешний цикл выполняется (n-1) раз,
внутренний цикл выполняется n/2 раз.
Число сравнений: 1/2 (n2-n)
Число операций обмена :
лучший случай - 3(n-1), худший случай - n2/4+3(n-1)
средний - n(ln n+ y), y ~ 0,577216
Общее количество операций :
n + (n-1 + 1) + (n-2 + 1) + ... + 2 = 1/2*(n2 + 2*n) - 1.
Сложность ~ O(n2).
14
15. Сортировка методом прямого
включения
Рассмотрим действия алгоритма на i-м шаге.
Последовательность к этому моменту разделена на две части:
готовую a[0]...a[i] и неупорядоченную a[i+1]...a[n].
На следующем, (i+1)-м каждом шаге алгоритма берем a[i+1] и
вставляем на нужное место в готовую часть массива.
Вставка элемента a[4] = 3 в упорядоченную подпоследовательность
a[0]…a[3]. Сравниваемые пары выделены. 15
16. Сортировка вставками со
сторожевым элементом
Алгоритм прямого включения можно слегка улучшить. На каждом
шаге внутреннего цикла проверяются 2 условия. Можно
объединить их в одно, поставив в начало массива специальный
сторожевой элемент. Он должен быть заведомо меньше всех
остальных элементов массива.
Тогда при j=0 будет заведомо верно a[0] <= x. Цикл остановится на
нулевом элементе, что и было целью условия j>=0.
16
17. Сортировка вставками со
сторожевым элементом
Однако, отсортированный массив будет не полон, так как из него
исчезло первое число.
Для окончания сортировки это число следует вернуть назад, а
затем вставить в отсортированную последовательность a[1]...a[n].
17
18. Сортировка методом прямого
включения. Оценка сложности
Число операций сравнения зависит от исходной
упорядоченности массива элементов:
упорядоченный массив = (n-1),
упорядоченный в обратном порядке = 1/2(n2+n)-1, среднее
значение = 1/4 (n2+n-2).
Число операций обмена :
лучший случай = 2 (n-1),
средний случай = 1/4 (n2+9n-10),
худший случай = 1/2 (n2+3n-4).
Cреднее, а также худшее число сравнений и перестановок
оцениваются как O(n2)
18
19. Сортировка методом Шелла
Сначала сравниваются и сортируются между собой ключи, отстоящие
один от другого на некотором расстоянии d. После этого процедура
повторяется для некоторых меньших значений d, а завершается
сортировка Шелла упорядочиванием элементов при d = 1 (обычной
сортировкой вставками или простыми обменами).
19
20. Сортировка методом Шелла
32 95 16 82 24 66 35 19 75 54 40 43 93 68
На первом шаге сортируются подсписки A, составленные из
всех элементов A, различающихся на 5 позиций, то есть
подсписки:
A5,1 = (32,66,40),
A5,2 = (95,35,43),
A5,3 = (16,19,93),
A5,4 = (82,75,68),
A5,5 = (24,54).
20
21. Сортировка методом Шелла
Очевидно, лишь последняя сортировка необходима, чтобы
расположить все элементы по своим местам. Так зачем нужны
остальные ?
Они продвигают элементы максимально близко к
соответствующим позициям, так что в последней стадии число
перемещений будет весьма невелико. Последовательность и так
почти отсортирована.
21
22. Сортировка методом Шелла.
Выбор приращения
Приращение - расстояние между сортируемыми элементами, в
зависимости от прохода. В конце приращение всегда равно 1.
Последовательность приращений определяет рост эффективности.
Первоначально используемая Шеллом последовательность длин
промежутков:
d1 = N/2, di = di – 1 /2, dk = 1
Сложность алгоритма О(сN2) в худшем случае.
22
23. Формула Седжвика:
Сортировка методом Шелла.
Выбор приращения
9*2s – 9*2s/2 + 1, если s четно
inc [s] =
8*2s – 6*2(s + 1)/2 + 1, если s нечетно
inc[0] = 1, inc[1] = 5, ...
Следует остановиться на значении inc[s-1], если 3*inc[s] > size.
Среднее количество операций: O(n7/6),
в худшем случае - порядка O(n4/3).
23
24. Быстрая сортировка
-cортировка разделением (Quicksort)
-алгоритм разработанный английским информатиком Чарльзом
Хоаром
-используется в стандартных утилитах сортировки
-основан на использовании обменного метода сортировки
24
25. Быстрая сортировка
Метод основан на подходе "разделяй-и-властвуй":
1. из массива выбрать элемент, называемый опорным, a [i];
2. сравнить все остальные элементы с опорным, на основании
сравнения разбить множество на три - «меньшие опорного»,
«равные» и «большие», расположить их в порядке меньшие-
равные-большие;
≤ a [i] a [i] ≥ a [i]
3. для обоих подмассивов: если в подмассиве более двух
элементов, рекурсивно запускаем для него ту же процедуру.
В конце получится полностью отсортированная
последовательность.
25
26. Быстрая сортировка. Пример
На входе массив a[0]...a[N] и опорный элемент p, по которому будет
производиться разделение.
1. Введем два указателя: i и j. В начале алгоритма они указывают,
соответственно, на левый и правый конец последовательности.
2. Будем двигать указатель i с шагом в 1 элемент по направлению к
концу массива, пока не будет найден элемент a[i] >= p. Затем
аналогичным образом начнем двигать указатель j от конца массива
к началу, пока не будет найден a[j] <= p.
3. Далее, если i <= j, меняем a[i] и a[j] местами и продолжаем двигать
i,j по тем же правилам. Повторяем шаги 2-3, пока i <= j.
26
27. Быстрая сортировка. Пример
Рассмотрим работу процедуры для массива a[0]...a[6] и опорного
элемента p = a[3].
27
28. Быстрая сортировка.
Свойства алгоритма
Общее быстродействие: O(n log n).
Метод неустойчив.
O(n2) операций, если каждый раз в качестве центрального
элемента выбирается максимум или минимум входной
последовательности.
Сортировка использует дополнительную память, так как
приблизительная глубина рекурсии составляет O(log n), а
данные о рекурсивных подвызовах каждый раз добавляются в
стек.
28
29. Сортировка слиянием
упорядоченных массивов.
Джон фон Нейман 1945 год.
Для решения задачи сортировки выполняются три этапа:
1. Сортируемый массив разбивается на две части примерно
одинакового размера;
2. Каждая из получившихся частей сортируется отдельно,
например - тем же самым алгоритмом;
3. Два упорядоченных массива половинного размера соединяются
в один.
29
30. Сортировка слиянием
упорядоченных массивов.
Cоединение двух упорядоченных массивов в один.
Пусть мы имеем два подмассива. Пусть также, элементы
подмассивов в каждом из этих подмассивов отсортированы по
возрастанию. Тогда:
1.Слияние двух подмассивов в третий результирующий массив.
На каждом шаге мы берём меньший из двух первых элементов
подмассивов и записываем его в результирующий массив. Счетчики
номеров элементов результирующего массива и подмассива из
которого был взят элемент увеличиваем на 1.
2."Прицепление" остатка.
Когда один из подмассивов закончился, мы добавляем все
оставшиеся элементы второго подмассива в результирующий массив.
30
31. Приведем пример реализации
алгоритма слияния двух
упорядоченных массивов в
один. На входе алгоритм
получает два отсортированных
массива, которые задаются
своим размером и элементами
типа int. На выходе алгоритм
выводит упорядоченный
массив, состоящий из всех
элементов двух исходных.
Сортировка слиянием
упорядоченных массивов.
31
32. Сортировка слиянием
упорядоченных массивов. Оценка
сложности данного метода.
Число сравнений ключей и число пересылок оценивается как
O(n*log n)
Для сортировки массива размера n требуется 2*n элементов
памяти.
32
33. Сравнение методов внутренней
сортировки
Min Avg Max
Прямое
включение
C = n-1
M = 2x(n-1)
(n2 + n - 2)/4
(n2 - 9n - 10)/4
(n2 -n)/2 - 1
(n2 -3n - 4)/2
Прямой
выбор
C = (n2 - n)/2
M = 3x(n-1)
(n2 - n)/2
nx(ln n + 0.57)
(n2 - n)/2
n2/4 + 3x(n-1)
Прямой
обмен
C = (n2 - n)/2
M = 0
(n2 - n)/2
(n2 - n)x0.75
(n2 - n)/2
(n2 - n)x1.5
Для сортировки методом Шелла порядок C и M есть O(n1.2), для
сортировки со слиянием - O(n*log n).
33
34. Сравнение времени сортировок
сортировка пузырьком;
шейкер-сортировка;
сортировка выбором;
сортировка вставками;
сортировка вставками со
сторожевым элементом;
сортировка Шелла.
34