Рон
ваше решение верное. Эта проблема пахнет быстрой сортировкой, не так ли?
То, что вы делаете с битом Kth (все 0 слева, 1 справа), называется разделением - вам нужно найти неупорядоченные элементы попарно и поменять их местами. Это процесс, используемый в выделении Хоара и в быстрой сортировке со специальной классификацией элементов - не нужно использовать элемент поворота.
Вы забыли указать в постановке задачи, сколько элементов в массиве (2 ^ k-2 или более), т. Е. Если разрешены повторы.
Если повторы не разрешены, каждый раздел действительно будет разбалансирован одним элементом. Используемый алгоритм является экземпляром Hoare's Selection (только разделите наименьшую половину). На каждом этапе разбиения количество рассматриваемых элементов уменьшается вдвое, следовательно, O (N) время выполнения. Это оптимально, поскольку каждый элемент должен быть известен до того, как будет найдено решение.
[Если повторы разрешены, используйте измененную Быструю сортировку (рекурсивно разбивайте обе половины), пока не получите пустую половину. Время работы, вероятно, составляет O (N Lg (N)), но это необходимо проверить.]
Вы говорите, что алгоритм провалился в вашем тестовом примере: вы, вероятно, неправильно реализовали некоторые детали.
Пример:
Начните с
5132670 (это диапазон {0..7})
После разбиения на битовый вес = 4 вы получите
0132 | 675
где самая короткая половина
675 (это диапазон {4..7})
После разбиения на битовый вес = 2 вы получите
5 | 67
где самая короткая половина
5 (это диапазон {4..5})
После разбиения на битовый вес = 1, вы получите
| 5
где самая короткая половина пуста (это диапазон {4}).
Готово. * * 1029