Сначала разделите массив на группы по крайней мере k+1
элементов. Таким образом, правильная позиция каждого элемента находится либо внутри группы, в которой элемент находится в данный момент, либо внутри группы слева или справа, но не дальше. Затем отсортируйте каждую группу.
Этот шаг занимает O((n/k) * k log k) = O(n log k)
.
Затем, после сортировки каждой группы, вы можете объединить i
группу с группой i+1
, для i
с 1
до n/(k+1) - 1
.
Под слиянием я понимаю процедуру слияния из сортировки слиянием. Группы не объединяются. Их размеры остаются прежними.
Каждое слияние занимает O(n/k)
, всего этот шаг O(n)
.