Я думаю, что вы хотите решить это с неправильным подходом. Я предполагаю, что вы хотите улучшить алгоритм в целом, а не переворачивать O (n). Потому что это невозможно. У вас всегда есть O (n), если вам нужно рассмотреть каждый из n элементов.
Как я уже сказал, вы можете улучшить алгоритм O (n ^ 2). Вы можете решить это в O (n):
Допустим, у нас есть этот список:
a b c d e
Затем вы изменяете этот список, используя ваш алгоритм:
e d c b a
e a b c d
и так далее ... в конце концов у вас есть это:
e a d b c
Вы можете получить этот список, если у вас есть два указателя, приходящие с обоих концов массива и чередующиеся между указателями (значение увеличения / уменьшения / получения). Что дает вам O (n) для всей процедуры.
Более подробное объяснение этого алгоритма:
Используя предыдущий список, мы хотим, чтобы элементы были в следующем порядке:
a b c d e
2 4 5 3 1
Итак, вы создаете два указателя. Один указывает на начало списка, другой на конец:
a b c d e
^ ^
p1 p2
Тогда алгоритм работает следующим образом:
1. Take the value of p2
2. Take the value of p1
3. Move the pointer p2 one index back
4. Move the pointer p1 one index further
5. If they point to the same location, take the value of p1 and stop.
or if p1 has passed p2 then stop.
or else go to 1.