17_Sorting.ppt
- Количество слайдов: 45
Сортировка Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2014
2 План n Сортировка: общие замечания ¨ ¨ n Сортировка прямым выбором ¨ ¨ n Идея Псевдокод Анализ алгоритма Сортировка бинарными вставками Идея алгоритма Временная сложность алгоритма Сортировка прямыми обменами ¨ ¨ Идея алгоритма Временная сложность алгоритма Улучшения алгоритма Шейкерная сортировка Сортировка Шелла ¨ ¨ n n Идея алгоритма Временная сложность алгоритма Сортировка слияниями ¨ ¨ Сортировка прямыми вставками ¨ ¨ n Задача сортировки Внутренняя и внешняя сортировка Устойчивость Сортировка массива n Идея алгоритма Временная сложность алгоритма Быстрая сортировка ¨ Идея алгоритма n Временная сложность алгоритма
Сортировка: общие замечания n n Задача сортировки Внутренняя и внешняя сортировка Устойчивость Сортировка массива
Сортировка: общие замечания Сортировка n Сортировка – процесс перестановки объектов заданной совокупности в определенном порядке (возрастающем или убывающем) n Целью сортировки обычно является облегчение последующего поиска элементов в отсортированном множестве n В зависимости от объема и структуры данных методы сортировки подразделяются на: Внутренние – сортировка массивов ¨ Внешние – сортировка файлов ¨ 4
5 Сортировка: общие замечания Сортировка: более формально n Дано: N объектов a 1, a 2, …, a. N n Требуется: упорядочить заданные объекты, т. е. переставить их в такой последовательности ap 1, ap 2, …, ap. N, чтобы их ключи расположились в неубывающем порядке kp 1 ≤ kp 2 ≤ … ≤ kp. N ¨ Ключ ki = f(ai) – некоторая функция элемента n n ai – целое число ai – структура => => ki = ai. key
Сортировка: общие замечания Сортировка: устойчивость n При устойчивой сортировке относительный порядок элементов с одинаковыми ключами не меняется n Если kpi ≤ kpj и i < j, то pi < pj n Устойчивость желательна, если элементы уже упорядочены 6
Сортировка: общие замечания Сортировка массивов n Массив – одна из наиболее распространенных совокупностей, подвергаемых сортировке n От алгоритмов сортировки массива требуется ¨ экономичность по памяти n ¨ Перестановки, упорядочивающие массив, должны выполняться на том же месте экономичность по времени n Мера эффективности C – количество сравнений ключей и M – число перестановок элементов 7
Сортировка: общие замечания Сортировка массивов: алгоритмы n Простые методы сортировки – прямые, временная сложность – O(n 2) сортировка прямыми вставками (by insertion) ¨ сортировка прямым выбором (by selection) ¨ сортировка прямыми обменами выбором (by exchange) ¨ n «Улучшенные» методы сортировки, временная сложность – O(n log n) быстрая сортировка Хоара (quicksort) ¨ сортировка слияниями (mergesort) ¨ coртировка Шелла (shellsort) ¨ … ¨ 8
Сортировка прямыми выставками n n Идея Псевдокод Анализ алгоритма Сортировка бинарными вставками
10 Сортировка вставками 5 7 5 6 7 K 5 6 7 8 K
11 Сортировка вставками Сортировка простыми вставками n Массив делится на две части ¨ «готовую» a 1, a 2, …, ai-1 ¨ исходную ai, ai+1, …, a. N n Для каждого i от 2 до N ¨ из исходной части извлекается i-й элемент ¨ вставляется в готовую часть на нужное место 4 27 51 14 31 42 1 8 24 3 59 33 44 53 16 10 38 50 21 36 4 14 27 51 31 42 1 8 24 3 59 33 44 53 16 10 38 50 21 36 4 14 27 31 51 42 1 8 24 3 59 33 44 53 16 10 38 50 21 36 4 14 27 31 42 51 1 8 24 3 59 33 44 53 16 10 38 50 21 36
Сортировка вставками Сортировка простыми вставками 12
13 Сортировка вставками Сортировка простыми вставками n Анализ алгоритма ¨ Лучший случай: массив упорядочен ¨ Худший случай: массив упорядочен в обратном порядке ¨ Сmin =N– 1 ¨ Cavg = (N 2 + N – 2)/4 ¨ Cmax = (N 2 + N – 4)/2 n Итог: Mmin = 3(N-1) Mavg = (N 2 + 9 N – 10)/4 Mmax = (N 2 + 3 N – 4)/2 T(N) = C(N) + M(N) = O(N 2)
Сортировка вставками Сортировка бинарными вставками n Сортировка простыми вставками может быть улучшена ¨ Можно ускорить поиск подходящего места в «готовой» части, т. к. она упорядочена ¨ В упорядоченной последовательности применим бинарный поиск! n n Сложность бинарного поиска в худшем случае есть O(log N) Количество сравнений есть O(N log N) ¨ Но n Итог: по-прежнему, M(N) = O(N 2) T(N) = O(N log N) +O(N 2) = O(N 2) 14
Сортировка прямым выбором n n n Идея Псевдокод Анализ алгоритма
16 Сортировка выбором Сортировка простым выбором n Массив делится на две части ¨ «готовую» a 1, a 2, …, ai-1 ¨ исходную ai, ai+1, …, a. N n Для каждого i от 1 до N– 1 ¨ присвоить k индекс минимального элемента в исходной части ¨ поменять местами элементы ai и ak 4 27 51 14 31 42 1 8 24 3 59 33 44 53 16 10 38 50 21 36 1 27 51 14 31 42 4 8 24 3 59 33 44 53 16 10 38 50 21 36 1 3 51 14 31 42 4 8 24 27 59 33 44 53 16 10 38 50 21 36 1 3 4 14 31 42 51 8 24 27 59 33 44 53 16 10 38 50 21 36
Сортировка выбором Сортировка простым выбором SELECTIONSORT(A) 1 for i 1 to length[A] – 1 do 2 k i 3 x A[i] 4 for j 1 to length[A] – 1 do 5 if A[j] < x then 6 k j 7 x A[j] 8 A[k] A[i] 9 A[i] x 17
18 Сортировка выбором Сортировка простым выбором n Анализ алгоритма Количество сравнений не зависит от начального порядка элементов: ¨ Лучший случай: массив упорядочен ¨ Худший случай: массив упорядочен в обратном порядке ¨ ¨ С = (N 2 – N)/2 Mmin = 3(N – 1) Mavg N(ln N + ), = 0. 577216… Mmax = N 2/4 + 3(N – 1) n Итог (худший случай) : T(N) = C(N) + M(N) = O(N 2) n В среднем сортировка выбором выгоднее сортировки вставками
Сортировка прямыми обменами n n n Идея Псевдокод Анализ алгоритма
20 Сортировка обменами Сортировка простыми обменами (пузырьковая сортировка) Идея: пузырек воздуха в стакане воды поднимается со дна вверх – самый маленький ( «легкий» ) элемент массива перемещается вверх ( «всплывает» ) Для каждого i от 2 до N Для каждого j от N до i n n n Если в паре элементов aj – 1 и aj нарушен порядок, ¨ то поменять местами aj – 1 и aj ¨ 1 -ый проход 2 -ой проход 3 -ий проход 5 5 5 1 1 1 2 2 1 5 5 5 2 2 2 1 1 2 2 5 5 3 3 3 3 3 5
Сортировка обменами Сортировка простыми обменами (пузырьковая сортировка) 21
Сортировка обменами Си-программа void main() { const int N = 10; int A[N], i, j, c; // заполнить массив элементы выше // вывести исходный массив A[i] уже for (i = 0; i < N-1; i ++){ поставлены for (j = N-2; j >= i ; j --) if ( A[j] > A[j+1] ) { с = A[j]; A[j] = A[j+1]; A[j+1] = с; меняем } A[j] и A[j+1] } // вывести полученный массив } 22
23 Сортировка обменами Улучшенный метод «пузырька» n n Если при выполнении очередного прохода не было обменов, то массив уже отсортирован и остальные проходы не нужны Реализуется через переменную-флаг, показывающую, были ли обмены ¨ Если флаг поднят, то обмены были и нужен еще один проход ¨ Если флаг опущен, то – выход 2 1 1 2 4 3 3 4
Сортировка обменами Улучшенный метод «пузырька» i = 0; do { flag = 0; // сбросить флаг for ( j = N-2; j >= i ; j -- ) if ( A[j] > A[j+1] ) { с = A[j]; A[j] = A[j+1]; A[j+1] = с; flag = 1; // поднять флаг } i ++; } while ( flag ); // выход при flag = 0 24
25 Сортировка обменами Шейкерная сортировка n Метод пузырька несимметричен ¨ При нарушении почти полного порядка «легкими» элементами, требуется мало проходов ¨ При нарушении почти полного порядка «тяжелыми» элементами, требуется много проходов 1 проход 3 прохода 2 4 1 3 2 1 2 4 3 2 3 1 n 1 4 3 4 Выход: чередовать направления проходов
Сортировка обменами Шейкерная сортировка 26
27 Сортировка обменами Сортировка простыми обменами n Анализ алгоритма ¨ Лучший случай: массив упорядочен ¨ Худший случай: массив упорядочен в обратном порядке ¨ Сmin = (N 2 – N)/2 ¨ Cavg = (N 2 – N)/2 ¨ Cmax = (N 2 – N)/2 n Итог: Mmin = 0 Mavg = (N 2 – N)/4 Mmax = (N 2 – N)/2 T(N) = C(N) + M(N) = O(N 2)
28 Сортировка обменами «Шейкерная» сортировка n Анализ алгоритма ¨ Лучший случай: массив упорядочен ¨ Худший случай: массив упорядочен в обратном порядке ¨ Сmin =N– 1 ¨ Cavg = (N 2 – N(k+ln N))/2 ¨ Cmax = (N 2 – N)/2 n Итог: Mmin = 0 Mavg = (N 2 – N)/4 Mmax = (N 2 – N)/2 T(N) = C(N) + M(N) = O(N 2)
Сортировка обменами Прямые методы сортировки n Сортировка обменами несколько менее эффективна сортировок вставками и выбором n Шейкерная сортировка выгодна, когда массив почти упорядочен n Общее свойство: перемещение элементов ровно на одну позицию за один прием ¨ n Можно показать, что среднее расстояние, на которое должен сдвигаться элемент равно N/3 Надо стремиться к дальним пересылкам элементов 29
Сортировка Шелла n n Идея алгоритма Анализ алгоритма
Сортировка Шелла (Д. Л. Шелл, 1959) n Элементы разбиваются на подмножества для некоторого h>1 ¨ a 1, a 1+h, a 1+2 h, a 1+3 h, … ¨ a 2, a 2+h, a 2+2 h, a 2+3 h, … ¨… ¨ at, at+h, at+2 h, at+3 h, … n n Сортировка проводится методом вставок для каждого подмножества h уменьшается и процедура повторяется, пока h>0 31
32 Сортировка Шелла 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 4 27 51 14 31 42 1 8 24 3 59 33 44 53 16 10 38 50 21 36 4 10 3 14 21 36 1 8 24 38 50 31 42 53 16 27 51 59 33 44 step=7 step=3 1 8 3 4 10 36 14 21 24 27 44 31 33 50 16 38 51 59 42 53 1 4 3 8 10 21 14 27 16 31 24 36 33 38 42 50 44 53 51 59 1 3 4 8 10 14 16 21 24 27 31 33 36 38 42 44 50 51 53 59 step=2 step=1
33 Сортировка Шелла n Анализ алгоритма Анализ приводит к сложным математическим задачам ¨ Для эффективной сортировки соседние значения не должны быть кратными ¨ n n ¨ Иначе массив распадается на непересекающиеся цепочки Требуется, чтобы цепочки взаимодействовали как можно чаще Д. Кнут предлагает выбирать h так (порядок обратный): n n 1, 4, 13, 40, 121, …, 1, 3, 7, 15, 31, …, т. е. hk– 1 = 3 hk+1, ht=1, t = [log 3 N] – 1 т. е. hk– 1 = 2 hk+1, ht=1, t = [log 2 N] – 1 Количество перестановок элементов M (по результатам экспериментов со случайными массивами) N = 25 N = 100000 Сортировка Шелла 50 7700 2 100 000 Сортировка простыми вставками 150 240 000 2. 5 млрд.
Сортировка слиянием n n Идея алгоритма Временная сложность алгоритма
35 Сортировка слиянием Cлияние упорядоченных массивов 4 14 27 51 1 3 8 24 31 42 59 n Java-код int[] merge(int[] a, int[] b) { int na = a. length, nb = b. length, nc; int[] c = new int[nc = na + nb]; int ia = 0, ib = 0, ic = 0; while (ia < na && ib < nb) { if (a[ia] < b[ib]) c[ic++] = a[ia++]; else c[ic++] = b[ib++]; } while (ia < na) c[ic++] = a[ia++]; while (ib < nb) c[ic++] = b[ib++]; return c; }
36 Сортировка слиянием (фон Неймана) 0 1 2 3 4 5 6 4 27 51 14 31 42 1 И так далее… 7 8 9 10 11 12 13 14 15 16 17 18 19 8 24 3 59 33 44 53 16 10 38 50 21 36
Сортировка слиянием Алгоритм сортировки слиянием (фон Неймана) n Псевдокод // Merge() сливает два упорядоченных подмассива // в единый подмассив Merge. Sort(A, left, right) { if (left < right) { mid = floor((left + right) / 2); // середина Merge. Sort(A, left, mid); Merge. Sort(A, mid+1, right); Merge(A, left, mid, right); } } 37
Сортировка слиянием 38 Алгоритм сортировки слиянием (фон Неймана) n Java-код public static void merge. Sort(int[] data) { int n = data. length; // Длина массива int[] alt. Data = new int[n]; // Дополнительный массив int[] from = data, // Указатели "откуда" и "куда" происходит слияние to = alt. Data; int len = 1; // Длина сливаемого фрагмента do { int start = 0; while (start < n) { // Сливаем участки from[start: (start+ len-1)] и from[(start+len): (start+2*len-1)] // в to[start: (start+2*len-1)] merge. Section( from, start, Math. min(start+ len, n), from, Math. min(start+len, n), Math. min(start+(len<<1), n), to, start); start += (len << 1); } // Меняем направление слияния int[] interm = from; from = to; to = interm; } while ((len <<= 1) < n); // Если последнего слияния результат оказался "не там", // то переносим результат "куда надо" if (from != data) { merge. Section(from, 0, n, from, n, n, data, 0); } }
Сортировка слиянием n Анализ алгоритма ¨ Анализ приводит к сложным математическим задачам ¨ Асимптотическая сложность – O(N log N) 39
Быстрая сортировка n n Идея алгоритма Временная сложность алгоритма
41 Быстрая сортировка (Хоара) 0 1 2 3 4 5 6 4 27 51 14 31 42 1 7 8 9 10 11 12 13 14 15 16 17 18 19 8 24 3 59 33 44 53 16 10 38 50 21 36 h l 1 3 4 10 8 14 51 42 24 27 59 33 44 53 16 31 38 50 21 36 1 3 4 8 10 14 36 42 24 27 21 33 44 50 16 31 38 51 53 59 1 3 4 8 10 14 31 16 24 27 21 33 36 50 44 42 38 51 53 59 1 3 4 8 10 14 21 16 24 27 31 33 36 38 44 42 50 51 53 59 1 3 4 8 10 14 16 21 24 27 31 33 36 38 42 44 50 51 53 59
Быстрая сортировка n Псевдокод 42
Быстрая сортировка Улучшения алгоритма n n n Первый элемент в сортируемом куске выбирается случайно и запоминается Участки, меньшие определенного размера, сортируются простыми способами Иногда исключение рекурсивных вызовов приводит к повышению эффективности 43
Быстрая сортировка n Анализ алгоритма ¨ Эффективность во многом зависит от сбалансированности разбиения на подмассивы n n n Наихудшее разбиение: 1 к (N– 1) => O(N 2) Лучшее разбиение: N/2 к N/2 => O(N log N) Средний случай: O(N log N) 44
Вопросы и ответы Вопросы? ¨ Сортировка: общие замечания n n ¨ Сортировка прямыми вставками n n ¨ n n n Идея алгоритма Временная сложность алгоритма Сортировка слияниями n n ¨ Идея алгоритма Временная сложность алгоритма Улучшения алгоритма Шейкерная сортировка Сортировка Шелла n ¨ Идея алгоритма Временная сложность алгоритма Сортировка прямыми обменами n ¨ Идея Псевдокод Анализ алгоритма Сортировка бинарными вставками Сортировка прямым выбором n ¨ Задача сортировки Внутренняя и внешняя сортировка Устойчивость Сортировка массива Идея алгоритма Временная сложность алгоритма Быстрая сортировка n n Идея алгоритма Временная сложность алгоритма 45


