Изменения

Перейти к: навигация, поиск
Нет описания правки
Научившись сливать с использованием <tex> O(1) </tex> дополнительной памяти и <tex> O(n) </tex> операций , оставшееся решение задачи становится очевидным. Будем сливать не рекурсивно, чтобы сэкономить память в стеке. Пусть на i-том шаге у нас отсортированы подряд идущие, не пересекающиеся куски массива размером <tex> 2^i </tex>(за исключением последнего, его размер может быть меньше). Тогда сольем сначала первый и второй кусок, потом третий и четвертый и так до последнего. Если последнему куску нету пари, то просто ничего не делаем.
==Алгоритм слияние ==
Количество операций на этом шаге <tex> O(n) </tex>
=== Шаг 2 ===
Возьмем и отсортируем группы по первому элементу(в случае равенства по последнему). Это можно сделать любой квадратичной или более быстрой сортировкой которая требует дополнительной памяти не больше чем <tex> О(1)</tex>, например сортировка выбором.
Так как кусков <tex> \sqrt{n} </tex> количество операций на этом шаге <tex> O(n) </tex>
Анонимный участник

Навигация