Сортировки (1 октября 2024)
- [10 минут] Два указателя и ответы на запросы в offline
- Количество различных чисел на отрезке li ≤ li+1, ri ≤ ri+1. O(n+m).
- Отрезки произвольны. Алгоритм Мо. O(nm1/2).
- [10 минут] Квадратичные сортировки
- Определения: число инверсий (мера упорядоченности), стабильность (через сортировку пар).
- Selection:
n2, n, -, 1
(число сравнений, числа присваиваний, стабильность)
- Insertion:
n+I, I, +, 1
- InsertionBS:
n+I, min(I,nlogn), +, 1
- Bubble:
n2, n2, +, 1
- [skipped] ShakerBubble:
n2, n2, +, 1
- [skipped] ShellSort:
n log2n, n log2n, -, 1
- [10 минут] Оценка снизу и сортировка подсчётом
- CountSort = Θ(n+m)
- Если доступны только сравнения, число сравнений: хотя бы log(n!) = Θ(nlogn)
- [5 минут] Напоминание. Сравнение трёх решений задачи о пересечении множеств
- Решение хеш-таблицей: Θ(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++
- Выбор разделяющего элемента в qsort: 1/2, median(1/4, 2/4, 3/4), random
- Что такое время работы вероятностного алгоритма? 1/R ∑1..R ti
- [10 минут] Оценка времени #1: вероятности
- [10 минут] Оценка времени #2: мы считаем T(n) = 1/n ∑ x=1..n-1 [T(x) + T(n-x)], далее интегралы
- IntroSort (std::sort = qsort + hsort + inssort)