Сортировки и порядковые статистика (12 октября 2016)
- [10 минут] Два указателя и ответы на запросы в offline
- Число различных чисел на отрезке li ≤ li+1, ri ≤ ri+1. O(n+m).
- Отрезки произвольны. Алгоритм Мо. O(nm1/2).
- [25 минут] Quick-Sort
- Версия с O(logn) доп памяти в худшем случае
- Выбор медианы 1/2, median(1/4, 2/4, 3/4), random
- [10 минут] Оценка времени #1: мы считаем среднее время = сумма по всем рандомам = сумма по всем парам
- [10 минут] Оценка времени #2: мы считаем T(n) = 1/n ∑ x=1..n-1 [T(x) + T(n-x)]
- IntroSort (std::sort)
- [20 минут] Порядковые статистика за O(n)
- QSort = get x + partition x + QSort + QSort, избавимся от одной ветки
- [10 минут] Одноветочный QuickSort. Время работы. Простая версия, дающая асимптотику, и, как упражнение, сложная с константой 4.
- [10 минут] Детерминированный partition.
- C++:
nth_element, partition
− Перерыв −
- [40 минут] Целочисленные сортировки
- Почему вообще числа можно сортировать быстрее?
- [5 минут] Count Sort.
- [15 минут] Radix sort.
- Сортируем пары за O(n+m)
- Сортируем вектора за O(n×len)
- Сортируем числа за O(nlognm)
- [20 минут] Bucket Sort
- Алгоритм:
if (Min != Max) разбить на n бакетов, вызваться для каждого
- Вариации: для каждого вызваться рекурсивно (BB), для каждого вызвать insertion sort (BI)
- Lm #0: MAX-MIN ≤ n ⇒ BI = Θ(n), BB = Θ(n)
- Lm #1: на равномерном распределении матожидание времние BI работает за O(n). Оценим ∑ki2
- Lm #2: BB работает в худшем за O(n log(MAX-MIN))