Сортировки (2 октября 2017)
- [10 минут] Два указателя и ответы на запросы в offline
- Число различных чисел на отрезке li ≤ li+1, ri ≤ ri+1. O(n+m).
- Отрезки произвольны. Алгоритм Мо. O(nm1/2).
- [15 минут] Квадратичные сортировки
- Определения: число инверсий (мера упорядоченности), стабильность (через сортировку пар).
- Selection:
n2, n, -, 1
(число сравнений, числа присваиваний, стабильность)
- Insertion:
n+inv, inv, +, 1
- InsertionBS:
n+inv, min(inv,nlogn), +, 1
- Bubble:
n2, n2, +, 1
- ShakerBubble:
n2, n2, +, 1
- [15 минут] Оценка снизу и сортировка подсчётом
- CountSort = O(n+m)
- Если доступны только сравнения, число сравнений: хотя бы log(n!) = Θ(nlogn)
- [10 минут] Сравнение трёх решений задачи о пересечении множеств
- Решение хеш-таблицей: Θ(n), доппамять, большая константа
- Сортировка + бинпоиск: O(sort) + O(nlogn),
sort, lower_bound
, минимум кода
- Два указателя: O(sort) + O(n), малая константа
− Перерыв −
- [20 минут] Merge Sort
- Рекурсивная сортировка, оценка. Пишем код, чтобы доппамять была в merge
- Число инверсий для каждого элемета.
- Нерекурсивная версия, избавляемся от копирования памяти
- STL:
stable_sort
, merge
, inplace_merge
- [20 минут] Quick Sort
- Собственно сортировка, пишем код partition на python
- Собственно сортировка, пишем код partition на c++
- Что такое время работы вероятностного алгоритма?
- Выбор медианы 1/2, median(1/4, 2/4, 3/4), random
- [10 минут] Оценка времени #2: мы считаем T(n) = 1/n ∑ x=1..n-1 [T(x) + T(n-x)]
- IntroSort (std::sort)