
01 - Алгоритмы сортировки.ppt
- Количество слайдов: 59
Алгоритмы и структуры данных. Алгоритмы сортировки
Содержание § Понятие алгоритма § Простые алгоритмы § Быстрые алгоритмы § Специальные алгоритмы
1. Понятие алгоритма.
1. Понятие алгоритма. Что такое алгоритм? Алгоритм (algorithm) — это любая корректно определенная вычислительная процедура, на вход (input) которой подается некоторая величина или набор величин, и результатом выполнения которой является выходная (output) величина или набор значений. Алгоритм представляет собой последовательность вычислительных шагов, преобразующих входные величины в выходные.
1. Понятие алгоритма. Свойства алгоритма: • Конечность – алгоритм должен заканчиваться после выполнения конечного числа шагов • Определенность – каждый шаг алгоритма должен быть точно определен • Ввод • Вывод • Эффективность – алгоритм считается эффективным, если все его операторы достаточно просты
1. Понятие алгоритма. • Алгоритм может быть задан на естественном языке, в виде компьютерной программы или даже воплощен в аппаратном обеспечении. Единственное требование — его спецификация должна предоставлять точное описание вычислительной процедуры, которую требуется выполнить.
2. Постановка задачи Различают сортировку массивов записей, целиком расположенных в основной памяти (внутреннюю сортировку), и сортировку файлов, хранящихся во внешней памяти и не помещающихся полностью в основной памяти (внешнюю сортировку). Для внутренней и внешней сортировки требуются существенно разные методы.
2. Постановка задачи • Естественным условием, предъявляемым к любому методу внутренней сортировки является то, что эти методы не должны требовать дополнительной памяти: все перестановки с целью упорядочения элементов массива должны производиться в пределах того же массива. Мерой эффективности алгоритма внутренней сортировки являются число требуемых сравнений значений ключа (C) и число перестановок элементов (M)
3. Основные алгоритмы
3. 1 Сортировка Выбором
3. 1 Сортировка Выбором Оценки алгоритма • В наихудшем случае • В среднем случае
3. 2 Сортировка включением • Пусть имеется массив ключей a[1], a[2], . . . , a[n]. Для каждого элемента массива, начиная со второго, производится сравнение с элементами с меньшим индексом (элемент a[i] последовательно сравнивается с элементами a[i-1], a[i-2]. . . ) и до тех пор, пока для очередного элемента a[j] выполняется соотношение a[j] > a[i], a[i] и a[j] меняются местами. Если удается встретить такой элемент a[j], что a[j] <= a[i], или если достигнута нижняя граница массива, производится переход к обработке элемента a[i+1] (пока не будет достигнута верхняя граница массива).
3. 2 Сортировка включением
3. 2 Сортировка включением Оценки алгоритма • В наихудшем случае
3. 3 Пузырьковая Сортировка • Алгоритм пузырьковой сортировки совершает несколько проходов по списку. Начиная с конца массива сравниваются два соседних элемента (a[n] и a[n-1]). Если выполняется условие a[n-1] > a[n], то значения элементов меняются местами. Процесс продолжается для a[n-1] и a[n-2] и т. д. , пока не будет произведено сравнение a[2] и a[1]. Понятно, что после этого на месте a[1] окажется элемент массива с наименьшим значением. На втором шаге процесс повторяется, но последними сравниваются a[3] и a[2]. И так далее. На последнем шаге будут сравниваться только текущие значения a[n] и a[n-1].
3. 3 Пузырьковая Сортировка
3. 3 Пузырьковая Сортировка Оценки алгоритма • В наихудшем случае
3. 3 Пузырьковая Сортировка Метод пузырька допускает три простых усовершенствования. • Во-первых, как показывает таблица, на четырех последних шагах расположение значений элементов не менялось. Поэтому, если на некотором шаге не было произведено ни одного обмена, то выполнение алгоритма можно прекращать. • Во-вторых, можно запоминать наименьшее значение индекса массива, для которого на текущем шаге выполнялись перестановки. Очевидно, что верхняя часть массива до элемента с этим индексом уже отсортирована, и на следующем шаге можно прекращать сравнения значений соседних элементов при достижении такого значения индекса. • В-третьих, метод пузырька работает неравноправно для "легких" и "тяжелых" значений. Легкое значение попадает на нужное место за один шаг, а тяжелое на каждом шаге опускается по направлению к нужному месту на одну позицию.
3. 3 Шейкерная сортировка На каждом следующем шаге меняется направление последовательного просмотра. В результате на одном шаге "всплывает" очередной наиболее легкий элемент, а на другом "тонет" очередной самый тяжелый.
3. 3 Шейкерная сортировка
3. 4 сортировка Шелла • Дальнейшее развитие метода сортировки включением • Для массива с 2^n элементами алгоритм работает следующим образом. На первой фазе производится сортировка включением всех пар элементов массива, расстояние между которыми есть 2^(n-1). На второй фазе производится сортировка включением элементов полученного массива, расстояние между которыми есть 2^(n-2). И так далее, пока мы не дойдем до фазы с расстоянием между элементами, равным единице, и не выполним завершающую сортировку с включениями.
3. 4 сортировка Шелла
3. 4 сортировка Шелла • В общем случае алгоритм Шелла переформулируется для заданной последовательности из t расстояний между элементами h 1, h 2, . . . , ht, для которых выполняются условия h 1 = 1 и h(i+1) < hi. • При правильно подобранных t и h сложность алгоритма Шелла является O(n^3/2))
З. 5 Быстрая сортировка (Quicksort) • Основа алгоритма была разработана в 1960 году (C. A. R. Hoare) • Быстрая сортировка популярна ввиду легкости ее реализации; это довольно хороший алгоритм общего назначения, который хорошо работает во многих ситуациях, и использует при этом меньше ресурсов, чем другие алгоритмы.
З. 5 Быстрая сортировка • Случайным образом выбирается некоторый элемент массива x, после чего массив просматривается слева, пока не встретится элемент a[i] такой, что a[i] > x, а затем массив просматривается справа, пока не встретится элемент a[j] такой, что a[j] < x. Эти два элемента меняются местами, и процесс просмотра, сравнения и обмена продолжается, пока мы не дойдем до элемента x. В результате массив окажется разбитым на две части - левую, в которой значения ключей будут меньше x, и правую со значениями ключей, большими x. Далее процесс рекурсивно продолжается для левой и правой частей массива до тех пор, пока каждая часть не будет содержать в точности один элемент.
З. 5 Быстрая сортировка
З. 5 Быстрая сортировка Оценки алгоритма • Алгоритм недаром называется быстрой сортировкой, поскольку для него оценкой числа сравнений и обменов является O(nlog n)
З. 5 Быстрая сортировка • Недостатки алгоритма состоят в том, что он рекурсивен (реализация очень затруднена когда рекурсия недоступна), в худшем случае он требует N 2 операций, кроме того он очень "хрупок": небольшая ошибка в реализации, которая легко может пройти незамеченной, может привести к тому, что алгоритм будет работать очень плохо на некоторых файлах.
З. 5 Быстрая сортировка Методы улучшения быстрой сортировки. 1. Небольшие Подфайлы - следует использовать самый лучший метод сортировки когда мы встречаем небольшой подфайл 2. Деление по Медиане из Трех - использования лучшего делящего элемента. 3. Нерекурсивная реализация
3. 6 Сортировка со слиянием • Пусть имеются два отсортированных в порядке возрастания массива p[1], p[2], . . . , p[n] и q[1], q[2], . . . , q[n] и имеется пустой массив r[1], r[2], . . . , r[2? n], который мы хотим заполнить значениями массивов p и q в порядке возрастания. Для слияния выполняются следующие действия: сравниваются p[1] и q[1], и меньшее из значений записывается в r[1]. Предположим, что это значение p[1]. Тогда p[2] сравнивается с q[1] и меньшее из значений заносится в r[2]. Предположим, что это значение q[1]. Тогда на следующем шаге сравниваются значения p[2] и q[2] и т. д. , пока мы не достигнем границ одного из массивов. Тогда остаток другого массива просто дописывается в "хвост" массива r.
3. 6 Сортировка со слиянием
3. 6 Сортировка со слиянием Merge. Sort (list, first, last) list сортируемый список элементов first номер первого элемента в сортируемой части списка last номер последнего элемента в сортируемой части списка if first
3. 6 Сортировка со слиянием
3. 6 Сортировка со слиянием Сложность алгоритма • В худшем O(n. Logn)
4. Сравнение алгоритмов
4. Специальные алгоритмы
4. Специальные алгоритмы Все рассмотренные алгоритмы обладают одним общим свойством: при сортировке используется только сравнение входных элементов. Назовем такие алгоритмы сортировки сортировкой сравнением (comparison sorts). Сейчас мы рассмотрим алгоритмы, в которых для определения правильного порядка элементов применяются операции, отличные от сравнений,
4. 1 Сортировка подсчетом Предполагается, что все n входных элементов — целые числа, принадлежащие интервалу от 0 до к, где к —некоторая целая константа. Для каждого входного элемента х определить количество элементов, которые меньше х. С помощью этой информации элемент х можно разместить на той позиции выходного массива, где он должен находиться.
4. 1 Сортировка подсчетом Предполагается, на вход подается массив A[], длины n. Кроме того массивы B[1, . . , n] и массив C[0, . . , k] В C[i] храним кол-во элементов, не превышающих i. Основной алгоритм выглядит так: for (i=n; i=1; downto 1) begin B[C[A[i]]]: =A[i] C[A[j]]: =C[A[i]]-1 end
4. 1 Сортировка подсчетом Исходный массив Построенный массив C[0, . . , k]
4. 1 Сортировка подсчетом Шаг 1. i=8 B[C[A[8]]]: =A[8]
4. 1 Сортировка подсчетом Шаг 2. i=7 B[C[A[7]]]: =A[7]
4. 1 Сортировка подсчетом Шаг 3. i=6 B[C[A[6]]]: =A[6]
4. 1 Сортировка подсчетом Шаг 4. i=5 B[C[A[5]]]: =A[5]
4. 1 Сортировка подсчетом Шаг 5. i=4 B[C[A[4]]]: =A[4]
4. 1 Сортировка подсчетом Шаг 6. i=3 B[C[A[3]]]: =A[3]
4. 1 Сортировка подсчетом Шаг 7. i=2 B[C[A[2]]]: =A[2]
4. 1 Сортировка подсчетом Шаг 8. i=1 B[C[A[1]]]: =A[1]
4. 1 Сортировка подсчетом Сложность алгоритма • Если число k = O(n), тогда сложность алгоритма O(n) Важное свойство алгоритма сортировки подсчетом заключается в том, что он устойчив: элементы с одним и тем же значением находятся в выходном массиве в том же порядке, что и во входном.
4. 2 Поразрядная сортировка Предполагается, что каждый из n элементов массива А — это число, в котором всего d цифр, причем первая цифра стоит в самом младшем разряде, а цифра под номером d — в самом старшем разряде: Radix_Sort(A, d) for (i : = 1; I = d; i++) do Устойчивая сортировка массива А по i-ой цифре
4. 2 Поразрядная сортировка
4. 2 Поразрядная сортировка
4. 2 Поразрядная сортировка
4. 2 Поразрядная сортировка
4. 2 Поразрядная сортировка Сложность алгоритма • сложность алгоритма O(n)
4. 3 Карманная сортировка Входные элементы подчиняются равномерному закону распределения, генерируются случайным процессом и равномерно распределены в интервале [0, 1) Нужно разбить интервал [0, 1) на n одинаковых интервалов, или карманов (buckets), а затем распределить по этим карманам n входных величин. Чтобы получить выходную последовательность, нужно просто выполнить сортировку чисел в каждом кармане, а затем последовательно перечислить элементы каждого кармана.
4. 3 Карманная сортировка Исходный массив и результат работы карманной сортировки
4. 3 Карманная сортировка Сложность алгоритма • сложность алгоритма O(n)
Литература • Дональд Кнут «Искусство программирования» • А. Ахо, Дж. Хопкрофт, Дж. Ульман «Построение и анализ вычислительных алгоритмов» • Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн «Алгоритмы: построение и анализ»