Возможно, люди, называющие это домашним заданием, возможно, еще не пытались его решить.
Мы используем следующее как подпрограмму:
Given an array a1 a2 ... an b1 b2 .. bn, convert in O(n) time and O(1) space to
b1 a1 b2 a2 ... bn an
Решение для этого можно найти здесь: http://arxiv.org/abs/0805.1598
Мы используем это следующим образом.
Выполните указанное выше чередование для первых 2 ^ (k + 1) - 2 элементов, начиная с k = 1, повторяя для k = 2, 3 и т. Д., Пока не пройдете конец массива.
Например, в вашем массиве мы получаем (чередование наборов, обозначенных скобками)
8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15
[ ][ ]
4, 8, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15 (k = 1, interleave 2)
[ ][ ]
2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15 (k = 2, interleave 6)
[ ][ ]
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 (k = 3, interleave 14)
Таким образом, общее время составляет n + n / 2 + n / 4 + ... = O (n).
Используемое пространство O (1).
Что это работает, можно доказать по индукции.