Здесь мы представляем эффективный алгоритм, который можно выполнить за время сложности O(n).
Основная идея такова: определить два указателя: один указатель A сканирует спереди назад, а другой указатель B сканирует сзади вперед. Указатель A сканирует четное число и делает паузу, указатель B сканирует нечетное число и делает паузу, а затем меняет местами два числа. После обмена продолжайте сканирование и обмен, как указано выше, пока указатель A и указатель B не совпадут и не остановятся.
Java-код этого алгоритма выглядит следующим образом:
Скопируйте код кода следующим образом:
Переупорядочение пакетов;
публичный класс Reorder {
public static void main(String[] args) {
int[] список = { 1, 2, 3, 4, 5, 7, 9, 11 };
reorderOddEven (список);
}
public static void reorderOddEven(int[] list) {
длина int = list.length;
for (int я = 0; я <длина; я++) {
System.out.print(список[i] + " ");
}
System.out.print("/n");
интервал начала = 0;
int end = длина - 1;
в то время как (начало <конец) {
while (begin < end && (list[begin] & 0x1) != 0)
начать++;
while (begin < end && (list[end] & 0x1) == 0)
конец--;
если (начало <конец) {
int temp = список [начало];
список[начало] = список[конец];
список [конец] = темп;
}
}
for (int я = 0; я <длина; я++) {
System.out.print(список[i] + " ");
}
}
}