
- •Алгоритмическая сложность. Понятие алгоритма. Формы записи. Асимптотический анализ.
- •Линейные структуры данных. Списки. Динамический массив.
- •Линейные структуры данных. Списки. Связный и двусвязный списки.
- •Линейные структуры данных. Очереди. Кольцевые очереди. Стеки. Деки. Алгоритм сортировочной станции.
- •Алгоритм[править | править код]
- •Деревья. Дерево поиска и бинарное дерево поиска. Основные понятия.
- •Сбалансированные деревья. Авл-деревья. Алгоритм добавления нового узла.
- •Сбалансированные деревья. Авл-деревья. Алгоритм удаления существующего узла.
- •21. Сортировка вставками (insertion)
- •25. Сортировка с использованием деревьев. Пирамидальная сортировка (heap-sort).
- •26. Поразрядные, блочные сортировки и сортировка подсчётом.
- •29. Графы. Построение минимального остовного дерева. Алгоритм Прима.
- •28. Графы. Построение минимального остовного дерева. Алгоритм Краскала.
21. Сортировка вставками (insertion)
алгоритм сортировки, в котором элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов.
Сложность O(n^2)
Задача заключается в следующем: есть часть массива, которая уже отсортирована, и требуется вставить остальные элементы массива в отсортированную часть, сохранив при этом упорядоченность. Для этого на каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированной части массива, до тех пор пока весь набор входных данных не будет отсортирован.
Самое слабое место в этом подходе — вставка элемента в отсортированную часть массива.
Проходим по массиву слева направо и обрабатываем по очереди каждый элемент. Слева от очередного элемента наращиваем отсортированную часть массива, справа по мере процесса потихоньку испаряется неотсортированная. В отсортированной части массива ищется точка вставки для очередного элемента.
Чтобы ускорить поиск места для вставки можно использовать бинарный поиск.
Массив из одного элемента считается отсортированным.
22. Селекционная сортировка (selection)
Находим минимальный элемент в текущем списке.
Меняем этот элемент с первым еще не отсортированным элементом
Продолжаем сортировку хвоста списка шагами 1 и 2, пока список не закончится
for j = 0 to A.length do
min = j
for i = j + 1 to A.length do
if A[min] > A[i] then
min = i
end if
end for
swap A[min], A[j]
end for
23. Сортировка «разделяй и властвуй». Сортировка слияниями (merge-sort).
Метод разделяй и властвуй состоит из трех пунктов:
Разделение задач на несколько, которые представляют экземпляры той же задачи, но меньше по размеру
Рекурсивное решение этих задач. Если размер задач мал, то решаются непосредственно.
Комбинирование решенных подзадач.
Алгоритм сортировки:
Сортируемый массив разбивается на две части примерно одинакового размера.
Затем каждая часть сортируется (к примеру, тем же алгоритмом) и обе части сливаются в одну
Эта процедура применяется до тех пор, пока сортируемая часть содержит хотя бы два элемента (чтобы можно было разбить на две части)
Слияние двух массивов в результирующий:
Пусть мы имеем уже два отсортированных по возрастанию массива, на каждом шаге мы берём меньший из двух первых элементов подмассивов и записываем его в результирующий массив. Счётчики номеров элементов результирующего массива и подмассива, из которого был взят элемент, увеличиваем на 1.
Если один из подмассивов закончился, добавляем все оставшиеся элементы в результирующий массив.
24. Сортировка «разделяй и властвуй». Быстрая сортировка (quick-sort).
Метод разделяй и властвуй состоит из трех пунктов:
Разделение задач на несколько, которые представляют экземпляры той же задачи, но меньше по размеру
Рекурсивное решение этих задач. Если размер задач мал, то решаются непосредственно.
Комбинирование решенных подзадач.
Алгоритм:
В массиве выбирается некий опорный элемент (pivot). Запускается процедура разделения массива, элементы меньше пивота – влево, больше или равные – вправо.
Теперь массив состоит из двух подмножеств, где левое меньше правого.
Если в подмассивах больше двух элементов – рекурсивно запускаем ту же процедуру.
В итоге получится полностью отсортированная последовательность.
От выбора опорного элемента не зависит корректность алгоритма, но чаще зависит его эффективность.
Для улучшения эффективности можно выбирать случайный или средний элемент или медиану среднего, первого и последнего.