Изменения

Перейти к: навигация, поиск
Нет описания правки
После того==Алгоритм слияния ==На вход алгоритм получает массив, как мы научились сливать с использованием <tex> Oкоторый состоит из двух отсортированных кусков: [[Файл:Merge_O(1) </tex> дополнительной памяти и <tex> O(n) </tex> операций , оставшееся решение задачи становится очевидным_1. Будем сливать не рекурсивно, чтобы сэкономить память в стеке. Пусть png|center|525px]]  Разобьем наш массив на i-том шаге у нас отсортированы блоки подряд идущие, не пересекающиеся куски массива размером идущих элементов длиной <tex> 2^i \lfloor \sqrt{n} \rfloor </tex>(за исключением последнего, его размер может быть меньше). Тогда сольем сначала первый и второй кусок, потом третий и четвертый и так до последнего. Если последнему куску нету пары, то просто ничего Остаток трогать не делаембудем. Выполняем это для всех i от <tex> 2 </tex> до <tex> \lceil ln [[Файл:Merge_O(n1) \rceil </tex> _2.png|center|525px]] 
==Алгоритм слияния ==Найдем блок, содержащий конец первого отсортированного куска. Поменяем его с последним блоком. В дальнейшем будем использовать его как буфер обмена.  [[Файл:FreememorymergesortMerge_O(1)_3.png|right|380pxcenter|thumb|Пример работы алгоритма слияния525px]]На вход алгоритм получает массив Отсортируем блоки по возрастанию по первому элементу (если первые элементы равны, который состоит из двух отсортированных кусковтогда по последнему). На выходе алгоритм возвращает отсортированный массив. Алгоритм состоит из нескольких шагов.=== Шаг 1 ===Разобьем наш массив на группы подряд идущих элементов длиной Для этого подойдет любая квадратичная или более быстрая сортировка, которая требует дополнительной памяти <tex> \sqrt{n} O (1) </tex>. Остаток трогать не будем. Найдем группуЗдесь нам выгодно использовать алгоритм, линейный по числу обменов, содержащую конец первого отсортированного кускат. Поменяем ее с последнейе. Добавим последнюю группу в остатокподходит [[Сортировка выбором|сортировка выбором (selection sort)]].
Количество Так как блоков <tex> \sqrt{n} </tex>, то количество операций на этом шаге <tex> O(n) </tex>.
=== Шаг 2 ===Возьмем и отсортируем группы по первому элементу (в случае равенства по последнему). Это можно сделать любой квадратичной или более быстрой сортировкой, которая требует дополнительной памяти <tex> O [[Файл:Merge_O(1) </tex>, например сортировка выбором. Следует заметить, что, после сортировки этих групп, элементы, которые стоят левее заданного и больше его, находились в противоположном куске отсортированного массива, также они находятся в пределах одной группы, поэтому количество инверсий для каждого элемента не больше <tex> \sqrt{n} </tex>_4.png|center|525px]]
Так как кусков <tex> \sqrt{n} </tex>, количество операций на этом шаге <tex> O(n) </tex>.
=== Шаг 3 ===
338
правок

Навигация