Я думал об этом немного больше, и я думаю, что вы достигли условия O (n log (n)) времени и O (1) с помощью сортировки слиянием.
Давайте посмотрим ...
Взять список:
3 -> 2 -> 1 -> 5 -> 6 -> 4
Первый проход:
Установить указатель на 1-й, 2-й член и3-е слагаемые
Установите меньший член между 1-м и вторым указателем, чтобы указать на больший член.
Установите последний из 2-х членов, чтобы он указывал на остальную часть исходного списка.
Повторяйте до концасписок.
2 -> 3 -> 1 -> 5 -> 4 -> 6
На этом этапе упорядочивается каждая пара терминов.
N-й проход:
Установите указатель на 1-й, (2 ^ (N-1)) -й и (2 ^ (N)) + 1-й члены
Возьмите меньший по значению узел и увеличьте его указатель.
Повторите процесспока оба списка (длиной 2 ^ N) не будут исчерпаны, каждый раз добавляя узел с меньшим значением к предыдущему узлу с меньшим значением.
Установите указатель на оставшуюся часть исходного списка.
Повторяйте до концасписок.
0-й проход: 3 -> 2 -> 1 -> 5 -> 6 -> 4 (заказывается каждый блок из 1 члена) (тривиальный)
1-й проход: 2 -> 3 -> 1-> 5 -> 4 -> 6 (каждый блок из 2-х членов упорядочен)
2-й проход: 1 -> 2 -> 3 -> 5 -> 4 -> 6 (каждый блок из 4-х членов упорядочен)
3-й проход: 1 -> 2 -> 3 -> 4 -> 5 -> 6 (упорядочен каждый блок из 8 членов)
Время: log (n) проходит, с n сравнениями для каждого прохода.
O (n log (n))
Пробел: указатель и целочисленные переменные
O (1)