Нет, это невозможно, хотя моя работа была бы намного проще, если бы это было :).
У вас есть коэффициент O (log n), которого вы не можете избежать. Вы можете выбрать его как время или пространство, но единственный способ избежать этого - не сортировать. С пространством O (log n) вы можете создать список продолжений, которые отслеживают, где вы спрятали элементы, которые не совсем соответствовали. С рекурсией это можно сделать, чтобы вписаться в кучу O (1), но это только с использованием кадров стека O (log n).
Вот прогресс коэффициентов сортировки слияния и выравнивания от 1 до 9.Обратите внимание, как вам требуется учет в журнальном пространстве для отслеживания инверсий порядка, вызванных двойными ограничениями постоянного пространства и линейных свопов.
. -
135792468
. -
135792468
: .-
125793468
: .-
123795468
#.:-
123495768
:.-
123459768
.:-
123456798
.-
123456789
123456789
Есть некоторые тонкие граничные условия, немного сложнее, чем бинарный поиск, чтобы получить права, и даже в этом (возможно) форме, и, следовательно, плохая проблема домашних заданий; но действительно хорошее умственное упражнение.
Обновление Видимо, я ошибаюсь и существует алгоритм, обеспечивающий время O (n) и O (1). Я загрузил документы, чтобы просветить себя, и отозвать этот ответ как неправильный.
Есть ли вопрос конкретно о слиянии-сортировке? Я знаю, что можно объединить сортировку на месте, но не в O (n) времени (по крайней мере, я никогда не слышал об этом.) – jrista
Нет, это не так. Я делаю аналогию с шагом слияния. Это похоже. – Sid
Если вы разместили точную формулировку вопроса, то это, похоже, не имеет ничего общего с mergesort. Существуют алгоритмы сортировки, которые представляют собой O (1) пространство и O (n) на месте для предварительно отсортированного массива (т. Е. Сортировки вставки). Mergesort не является одним из них, и хорошо известно, что это не один из них, поэтому ... – jrista