여기서는 O(n) 시간 복잡도 내에서 완료할 수 있는 효율적인 알고리즘을 소개합니다.
핵심 아이디어는 두 개의 포인터를 정의하는 것입니다. 하나의 포인터 A는 앞에서 뒤로 스캔하고, 하나의 포인터 B는 뒤에서 앞으로 스캔합니다. 포인터 A는 짝수로 스캔하고 일시 정지하고, 포인터 B는 홀수로 스캔하고 일시 정지한 다음 두 숫자를 교환합니다. 교환 후 포인터 A와 포인터 B가 일치하고 멈출 때까지 위와 같이 계속 스캔하고 교환합니다.
이 알고리즘의 Java 코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 재주문;
공개 클래스 재정렬 {
공개 정적 무효 메인(String[] args) {
int[] 목록 = { 1, 2, 3, 4, 5, 7, 9, 11 };
reorderOddEven(목록);
}
공개 정적 무효 reorderOddEven(int[] 목록) {
int 길이 = list.length;
for (int i = 0; i < 길이; i++) {
System.out.print(list[i] + " ");
}
System.out.print("/n");
int 시작 = 0;
int end = 길이 - 1;
while (시작 < 끝) {
while (시작 < 끝 && (list[begin] & 0x1) != 0)
시작++;
while(시작 < 끝 && (목록[끝] & 0x1) == 0)
끝--;
if (시작 < 끝) {
int temp = 목록[시작];
목록[시작] = 목록[끝];
목록[끝] = 임시;
}
}
for (int i = 0; i < 길이; i++) {
System.out.print(list[i] + " ");
}
}
}