- •1. Понятие алгоритмической сложности
- •Примеры
- •2. Сравнить структуры данных массив и список
- •3. Сортировки. Назначение, типы, сравнение.
- •4. Стек очередь двунаправленная очередь
- •5. Деревья.
- •6. Пирамидальная сортировка
- •7. Быстрая сортировка
- •8. Алгоритм Дийкстры
- •Первый шаг
- •Второй шаг
- •10. Шаблон проектирования “фабричный метод”
- •11. Шаблон проектирования “адаптер”
- •12. Шаблон проектирования “стратегия”
- •Дополнительно к 10 – 12
6. Пирамидальная сортировка
Пирамидальная сортировка – сортировка кучей (бинарное сортирующее дерево) – алгоритмическая сложность всегда O(n∙logn). Общая идея пирамидальной сортировки заключается в том, что сначала строится пирамида из элементов исходного массива, а затем осуществляется сортировка элементов. Массив можно отсортировать, если на его основе строить и перестраивать сортирующее дерево.
Сортирующее дерево - дерево, у которого любой родитель больше (или меньше, смотря в какую сторону оно сортирующее) чем его потомки. Чтобы из обычного сделать сортирующее нужно двигаться от потомков вверх к родителям и если потомок больше родителя, то менять местами. Если такой обмен произошёл, опустившегося на один уровень родителя нужно сравнить с потомками ниже – может и там тоже будет повод для обмена.
Преобразовывая неотсортированную часть массива в сортирующее дерево, в итоге в корень «всплывёт» наибольший элемент. Обмениваем максимум с последним ключом неотсортированного подмассива. Структура перестанет быть сортирующим деревом, но его неотсортированная часть станет меньше на один узел. К этой неотсортированной части заново применим всю процедуру, то есть преобразуем её в сортирующее дерево с последующей перестановкой найденного максимума в конец. И так действуем до тех пор, пока неотсортированная часть не скукожится до одного-единственного элемента.
Достоинства и недостатки.
Достоинства |
Недостатки |
Имеет доказанную оценку худшего случая О (n log n) |
Неустойчив |
Сортирует на месте, т.е. требует всего О(1) дополнительной памяти |
На почти отсортированных массивах работает столь же долго, как и на хаотических данных |
|
На одном шаге выборку приходится делать хаотично по всей длине массива – поэтому алгоритм плохо сочетается с кэшированием памяти |
|
Методу требуется «мгновенный» прямой доступ; не работает на связных списках |
Из-за сложности алгоритма выигрыш получается только на больших n. На небольших n (до нескольких тысяч) быстрее сортировка Шелла.
7. Быстрая сортировка
Быстрая сортирвка (Чарльз Хоар) - это алгоритм сортировки, сложность которого в среднем и лучшем составляет O(n∙log(n)), в худшем - O(n2). Суть его предельно проста: выбирается так называемый опорный элемент, и массив делится на 3 подмассива: меньших опорного, равных опорному и больших опорного. Левая и правая границы должны сомкнуться, потом этот алгоритм применяется рекурсивно к подмассивам.
Алгоритм:
1. Выбираем опорный элемент.
2. Разбиваем массив на три части
- создаем переменные l и r – индексы соответственно начала и конца рассматриваемого подмассива
- увеличиваем l, пока l-ый элемент меньше опорного
- уменьшаем r, пока r-ый элемент больше опорного
- если l все еще меньше r, то меняем l-ый и r-ый элементы местами, инкрементируем l и декрементируем r
- если l вдруг становится больше r, то прерываем цикл
3. Повторяем рекурсивно, пока не дойдем до массива из 1 элемента