
- •Задание По изученному курсу Основ Процедурно-Структурного Программирования
- •1.1 Основные классы методов сортировки
- •1.2 Сортировка вставками
- •Алгоритмы устойчивой сортировки
- •Сортировка выбором
- •Сортировка пузырьком
- •Алгоритм
- •Сортировка перемешиванием
- •Алгоритмы неустойчивой сортировки
- •Сортировка Шелла
- •Сортировка расчёской
- •Быстрая сортировка
Алгоритмы устойчивой сортировки
Сортировка выбором (Selection sort) — Сложность алгоритма: O(n2); поиск наименьшего или наибольшего элемента и помещение его в начало или конец упорядоченного списка
Сортировка пузырьком (англ. Bubble sort ) — сложность алгоритма: O(n2); для каждой пары индексов производится обмен, если элементы расположены не по порядку.
Сортировка перемешиванием (Шейкерная, Cocktail sort, bidirectional bubble sort) — Сложность алгоритма: O(n2)
Гномья сортировка — имеет общее с сортировкой пузырьком и сортировкой вставками. Сложность алгоритма — O(n2).
Сортировка вставками (Insertion sort) — Сложность алгоритма: O(n2); определяем где текущий элемент должен находиться в упорядоченном списке и вставляем его туда
Сортировка слиянием (Merge sort) — Сложность алгоритма: O(n log n); требуется O(n) дополнительной памяти; выстраиваем первую и вторую половину списка отдельно, а затем — сливаем упорядоченные списки
Сортировка с помощью двоичного дерева (англ. Tree sort) — Сложность алгоритма: O(n log n); требуется O(n) дополнительной памяти
Алгоритм сортировки Timsort (англ. Timsort) — Сложность алгоритма: O(n log n); требуется O(n) дополнительной памяти; Комбинированный алгоритм (используется сортировка вставками и сортировка слиянием. Разработан для использования в языке Python[4]
Сортировка подсчётом (Counting sort) — Сложность алгоритма: O(n+k); требуется O(n+k) дополнительной памяти (рассмотрено 3 варианта)
Блочная сортировка (Корзинная сортировка, Bucket sort) — Сложность алгоритма: O(n); требуется O(k) дополнительной памяти и знание о природе сортируемых данных, выходящее за рамки функций "переставить" и "сравнить".
Сортировка выбором
Сортировка выбором (Selection sort) — алгоритм сортировки. Может быть реализован и как устойчивый и как неустойчивый. На массиве из n элементов имеет время выполнения в худшем, среднем и лучшем случае Θ(n2), предполагая что сравнения делаются за постоянное время.
Шаги алгоритма:
находим номер минимального значения в текущем списке
производим обмен этого значения со значением первой неотсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции)
теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы
Для реализации устойчивости алгоритма необходимо в пункте 2 минимальный элемент непосредственно вставлять в первую неотсортированную позицию, не меняя порядок остальных элементов.
Пример неустойчивой реализации:
template <class Item>
void selection(Item a[], int len) {
/* внешний цикл. i – позиция первого неотсортированного элемента на данной итерации */
for (int i = 0; i < len - 1; i++) {
int min = i; /* min – позиция минимального элемента */
/* внутренний цикл. если найден элемент строго меньший текущего минимального, записываем его индекс как минимальный */
for(int j = i + 1; j < len; j++) {
if(a[j] < a[min])
min = j;
}
if(min != i) /* минимальный элемент не является первым неотсортированным, обмен нужен */
exch(a[i], a[min]);
}
}
Покажем, почему данная реализация является неустойчивой. Рассмотрим следующий массив из элементов, каждый из которых имеет два поля. Сортировка идет по первому полю. Массив до сортировки: { (2, a), (2, b), (1, a) } Уже после первой итерации внешнего цикла будем иметь отсортированную последовательность: { (1, a), (2, b), (2, a) } Теперь заметим, что взаимное расположение элементов (2, a) и (2, b) изменилось. Таким образом, рассматриваемая реализация является неустойчивой.
Так как после каждого прохода по внутреннему циклу делается только один обмен, то общее число обменов равно N-1, что в N/2 раз меньше, чем в сортировке пузырьком. Число проходов по внутреннему циклу равно N-1 даже в случае сортировки частично или полностью отсортированного массива. Наихудший случай: Число сравнений в теле цикла равно (N-1)*N/2. Число сравнений в заголовках циклов (N-1)*N/2. Число сравнений перед операцией обмена N-1. Суммарное число сравнений N2−1. Число обменов N-1. Наилучший случай:
Время сортировки 10000 коротких целых чисел на одном и том же программно-аппаратном комплексе сортировкой выбором составило ≈40сек., а ещё более улучшенной сортировкой пузырьком ≈30сек.
Пирамидальная сортировка сильно улучшает базовый алгоритм, используя структуру данных «куча» для ускорения нахождения и удаления минимального элемента.
Существует также двунаправленный вариант сортировки методом выбора, в котором на каждом проходе отыскиваются и устанавливаются на свои места и минимальное, и максимальное значения.