Структуры и алгоритмы обработки данных Лекция 7
Структуры и алгоритмы обработки данных Лекция 7 Методы улучшения алгоритмов сортировок
-АЛГОРИТМ ДЛЯ УПОРЯДОЧЕНИЯ НЕКОТОРОГО МНОЖЕСТВА ЭЛЕМЕНТОВ ОБЫЧНО ИЛИ Оценка алгоритма сортировки Время сортировки – основной параметр, характеризующий быстродействие алгоритма Память – ряд алгоритмов сортировки требуют выделения дополнительной памяти под временное хранение данных Устойчивость – сортировка не меняет взаимного расположения равных элементов Естественность поведения – эффективность метода при обработке уже отсортированных, или частично отсортированных данных 2
Сортировка Внутренняя сортировка Внешняя сортировка или сортировка массивов сортировка файлов Методы внутренней сортировки Прямые методы Улучшенные методы вставкой быстрая (включением) выбором Шелла (выделением) обменом 3 ( «пузырьковая» )
Временная Дополнительная Естественность Алгоритм Устойчивость сложность память поведения Bubble. Sort - метод обмена Θ(n 2) не требуется да нет (пузырьковый) Select. Sort Θ(n 2) не требуется нет – метод выбора Insert. Sort Ω(n), O(n 2) не требуется да - метод вставок 4
Алгоритмы: • простые и понятные, но неэффективные для больших массивов сложность O(N 2) q метод пузырька q метод выбора q метод прямой вставки сложность O(N·log. N) • сложные, но эффективные q «быстрая сортировка» (Quick Sort) q сортировка «кучей» (Heap Sort) время O(N 2) q сортировка слиянием q пирамидальная сортировка O(N·log. N) НЕ СУЩЕСТВУЕТ УНИВЕРСАЛЬНОГО, НАИБОЛЕЕ ЭФФЕКТИВНОГО СПОСОБА СОРТИРОВКИ N 5
44 6 6 да 55 44 12 Сортировка обменом / метод пузырька да 12 55 18 да 42 12 44 да нет 94 42 55 да 18 94 42 да 6 18 67 нет 67 94 6
1 Все пары На одном из расположены Продолжать проходов в правильном процесс не имеет не произошло порядке, смысла ни одного обмена массив уже отсортирован Запомнить, производился ли на данном проходе какой-либо обмен! Если нет – алгоритм заканчивает работу 7
2 Все пары соседних Дальнейшие проходы можно элементов с индексами, заканчивать на индексе k, меньшими k, уже вместо того чтобы двигаться расположены в нужном до установленной заранее порядке верхней границы i Ввести логическую переменную – признак наличия хотя бы одного обмена в проходе 8
1+2 9
3 Массив 2 3 4 5 6 1 будет Тяжелые пузырьки отсортирован за 1 Легкий пузырек проход опускаются снизу поднимется с минимальной Сортировка наверх скоростью: один шаг последовательности за один проход за итерацию 6 1 2 3 4 5 потребует 5 проходов Можно менять направление следующих один за другим проходов - шейкер-сортировка 10
3 Параметры блок-схемы § сортируемая последовательность {a[i]} § индекс ее первого элемента – lb (lower bound - нижняя граница) § индекс ее последнего элемента - ub (upper bound - верхняя граница) Блок-схема шейкер-сортировки 11
Временная Дополнительная Естественность Алгоритм Устойчивость сложность память поведения Bubble. Sort - метод обмена Θ(n 2) не требуется да нет (пузырьковый) Шейкер- Bubble. Sort сортировка - улучшенные Θ(n 2) не требуется теряет да методы обмена устойчивость В лучшем случае, когда массив уже упорядочен, потребуется всего один проход и n-1 сравнение, что составляет O(n). Перестановки в этом случае не выполняются В худшем случае эти виды улучшенной сортировки не отличаются от исходного алгоритма 12
«Разделяй и властвуй" В 1962 году Ч. А. Р. Хоар (Charles Antony Richard Hoare) предложил улучшенный вариант обменной сортировки Основная идея улучшения - обменивать не рядом стоящие элементы массива, а расположенные как можно дальше друг от друга v Выбирается некоторое значение (x)- барьерный элемент; v Просматриваем массив, двигаясь слева направо, пока не найдется элемент, больший x v Затем просматриваем его справа налево, пока не найдется элемент, меньший x 13
«Разделяй и властвуй" v Меняем найденные элементы местами v В случае, если не найден наибольший или наименьший элементы, местами меняется средний элемент с найденным наибольшим или наименьшим элементом; v Дойдя до середины имеем 2 части массива; v Процесс продолжается для каждой части, пока массив не будет отсортирован A[i] <= X A[i] >= X 14
«Разделяй и властвуй" 1. Выберем один из элементов массива - барьер 2. Элементы массива просматриваем с двух концов. При просмотре слева направо (начиная с первого) выбираем элемент, не меньший чем барьерный. А во время просмотра справа налево (начиная с последнего) выбирается элемент не больший чем барьерный 3. Найденная пара элементов меняется местами, после чего просмотры возобновляются 4. Завершается проход по массиву после того, как индекс просмотра слева, станет больше чем индекс просмотра справа барьер 43 44 55 12 42 94 18 6 67 15 Проход направо Проход налево
Пусть a =42 ― барьерный элемент i ― индекс элементов при проходе направо: i=1, 2, … j ― индекс элемента при проходе налево: j=N, N-1, N-2, … 44 55 12 42 94 18 6 67 Обмен Меньше барьерного Больше барьерного Проход слева направо: i=1, x 1 (=44) > a (=42). Проход справа налево: j=7, x 7 (=6) < a (=42). Проход слева направо: i=2, x 2 (=55) > a (=42). Проход справа налево: j=6, x 6 (=18) < a (=42). Проход слева направо: i=4, Достигнут барьер Проход справа налево: j=4, Достигнут барьер Как следует поступить далее? Можно рекурсивно отсортировать обе части массива 16
Меньше Больше 7 равно 7 4 4 7 7 19 19 8 3 8 12 16 3 12 11 11 12 16 8 4 Отсортиро- 4>3 Отсортированная 19>16 ванная часть Барьерный элемент Массив отсортированэлемент по возрастанию 12>7 переносим правую часть, т. т. т. к. 8>7 переносим ввв правую часть, к. к. к. правую часть, 12>11 переносим в правую часть, т. 19>12 19>11 переносим 16>7, 8>7, 11>7, 19>7 не 16>7 не переносим, 4<7 переносим, 16>11 непереносим, 8<11 16>12, не переносим, 16>11, 12>11, не переносим, 12 7=7 поэтому меняем местами 7 11 и поэтому меняем местами 4 ии 8 и 12 19 12=12 12 8 12 17 11=11 поэтому меняем местами
«Разделяй и властвуй" Параметры блок-схемы § сортируемая последовательность {a[i]} § индекс ее первого элемента – lb (lower bound - нижняя граница) § индекс ее последнего элемента ub (upper bound - верхняя граница) Блок-схема алгоритма быстрой сортировки 18
«Разделяй и властвуй" Параметры блок-схемы § сортируемая последовательность {a[i]} § индекс ее первого элемента – lb (lower bound - нижняя граница) § индекс ее последнего элемента - ub (upper bound - верхняя граница) § рivot – барьерный элемент Блок-схема процедуры разделения массива 19
«Разделяй и властвуй" Довольно сложный анализ эффективности алгоритма быстрой сортировки Ч. Хоара показал: v в оптимальном случае общее количество сравнений равно C = N*log 2 N , а общее количество пересылок (присваиваний) M=N*log 2 N/6 v Оптимальный вариант, при котором достигается самая высокая эффективность и минимальная сложность сортировки, обеспечивается выбором в качестве барьера так называемого медианного элемента массива 20
«Разделяй и властвуй" Медианой массива (медианным элементом) считается такой его элемент, который не меньше одной половины элементов массива и при этом не больше другой половины (независимо от их взаимного положения, важно лишь общее количество элементов) Так для массива состоящего из 7 элементов, нужно выбрать такой элемент, который окажется не больше трёх любых элементов и при этом не меньше трёх других его элементов Например , для массива {16, 12, 90, 84, 18, 67, 10} медианой является элемент x 5 =18, так как он больше x 1 =16, x 2 =12 и x 7 =10, и при этом меньше чем x 3=90, x 4=84 и x 6=67 21
«Разделяй и властвуй" Выбирать медианный элемент довольно сложно, во всяком случае такой выбор представляет собой самостоятельную задачу Удивительное свойство сортировки Хоара - её средняя производительность при случайном выборе (в том числе при выборе среднего) барьерного элемента отличается от оптимального всего лишь коэффициентом 2*log 102 22
«Разделяй и властвуй" 23
«Разделяй и властвуй" 24
Временная Дополнительная Естественность Алгоритм Устойчивость сложность память поведения Bubble. Sort - метод Θ(n 2) не требуется да нет обмена (пузырьковый) использует сортировка Быстрая O(n log n) дополнительную теряет да сортировка устойчивость память (рекурсия) 25
«Разделяй и властвуй" 26
Сортировка прямыми вставками Исходное положение: x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] 44 43 55 12 42 94 18 6 67 1 шаг 44 55 12 42 94 18 6 67 Упорядоченная часть Неупорядоченная часть 2 шаг 44 55 12 42 94 18 6 67 44 12 42 94 18 6 67 27
Сортировка прямыми вставками 3 шаг 44 55 12 42 94 18 6 67 44 55 42 94 18 6 67 4 шаг 12 44 55 42 94 18 6 67 12 44 55 94 18 6 67 28
Алгоритм сортировки вставками можно слегка улучшить v На каждом шаге внутреннего цикла проверяются 2 условия v Можно объединить их в одно, поставив в начало массива специальный сторожевой элемент v Он должен быть заведомо меньше всех остальных элементов массива Вставка сторожевого элемента 29
Сортировка будет Цикл остановится происходить Сравнение Тогда при j = 0 на нулевом правильным производилось будет заведомо элементе, что и образом, а во n 2 раз, это – верно a[0] ≤ x было целью внутреннем цикле реальное условия j ≥ 0 станет на одно преимущество сравнение меньше Отсортированный массив будет не полон, так как из него исчезло первое число Для окончания сортировки это число следует вернуть назад, а затем вставить в отсортированную последовательность a[1]. . . a[n] Замена сторожевого элемента на a[0] и досортировка массива 30
Блок-схема улучшенного алгоритма сортировки вставками Функция Get. Min( ) - возвращает элемент, заведомо меньший всех возможных элементов массива, определяется пользователем Метод является устойчивым и естественным 31
Сортировка включениями с уменьшающимся расстоянием Сортировка Шелла была названа в честь ее изобретателя – Дональда Шелла, который опубликовал этот алгоритм в 1959 году Основная идея этой сортировки состоит в выполнении нескольких предварительных проходов, на каждом из которых методом прямых вставок сортируются некоторые подпоследовательности элементов массива с заданным шагом k Такая модификация метода сортировки позволяет быстро переставлять далекие неупорядоченные пары значений (сортировка таких пар обычно требует большого количества перестановок, если используется сравнение только соседних элементов) В сортировке Шелла элементы каждой из подпоследовательностей упорядочиваются независимо от всех остальных подпоследовательностей 32
Сортировка включениями с уменьшающимся расстоянием Д. Шелл предложил выполнить несколько таких проходов с разными шагами. Причем, на последнем проходе шаг обязательно должен быть равным единице То есть на последнем шаге необходимо выполнить самую обычную сортировку прямыми вставками В первоначально предложенном Д. Шеллом варианте сортировка выполнялась за четыре прохода с шагами 9, 5, 3 и 1 До настоящего времени неизвестно, сколько предварительных проходов нужно сделать для получения наилучших результатов и какие шаги должны быть для этого выбраны Опытным путем подобраны следующие рекомендуемые шаги по проходам: 1, 4, 13, 40, 121, 364, 1093, 3280, 9841. . . 1, 8, 23, 77, 281, 1073, 4193, 16577. . . 1, 3 5, 9, 37, … 1, 3, 7, 15, 31, … 33
Пример 1 34
Пример 2 35
Пример 3 2 шаг. 2 группы из 4 -х элементов 1 4 2 -х 8<9 6<7 6<8 8>6 8>7 8<9 9>7 1 8 4 7 1 9 8 12 6 14 6 12 9 14 7 4 1 8 1 2 1 3 2 4 1 2 3 1 2 4 1<4 4>1 4<12 12<14 4<12 1<14 36
Пример 3 3 шаг. 1 группа из 8 -ми элементов 1 4 6 6 4 7 12 12 12 14 8 9 14 9 8 9 1<4 1<6 4<6 6<7 7<12 8<12 12>9 6>4 7<8 8<9 12<14 12>8 14>9 Массив отсортирован по возрастанию 37
Блок-схема алгоритма сортировки Шелла с выбором шагов, предложенных Кнутом: …, 121, 40, 13, 4, 1 38
39
Временная Дополнит Естественность Алгоритм Устойчивость сложность память поведения Insert. Sort - метод Ω(n), O(n 2) не требуется да вставок O(n 1. 25) сортировка O(n 1. 5) – Метод Шелла не требуется теряет да наихудший устойчивость случай 40
сортировка пузырьком шейкер-сортировка выбором сортировка вставками со сторожевым элементом сортировка Шелла 41
По результатам замеров производительности методов можно сделать следующие выводы: v Наиболее универсальным методом, является метод быстрой сортировки ( «Quick. Sort» ), он показывает стабильно высокие результаты на любых размерах массивов. На втором месте находится метод Шелла. Его использование может быть обосновано более простым алгоритмом с точки зрения программиста v Метод вставки эффективен, при условии большого времени выполнения операций перестановки, так как он является абсолютным лидером по количеству перестановок, проигрывая при этом по количеству сравнений 42
По результатам замеров производительности методов можно сделать следующие выводы: v При использовании небольших массивов данных нет большой разницы по скорости между методами сортировки, поэтому целесообразнее применять метод пузырька или метод вставок v Исследование проводилось на массивах с большой степенью неупорядоченности. Для массивов, которые уже являются почти отсортированными, наиболее применим метод сортировки вставками 43
вставка выбор обмен метод Шелла 44
х_Слайды_7.pptx
- Количество слайдов: 44

