Di sini kami memperkenalkan algoritma efisien yang dapat diselesaikan dalam kompleksitas waktu O(n).
Ide intinya adalah: tentukan dua pointer, satu pointer A memindai dari depan ke belakang, dan satu pointer B memindai dari belakang ke depan. Penunjuk A memindai ke angka genap dan berhenti, penunjuk B memindai ke angka ganjil dan berhenti, lalu menukar kedua angka tersebut. Setelah pertukaran, lanjutkan pemindaian dan pertukaran seperti di atas hingga penunjuk A dan penunjuk B bertepatan dan berhenti.
Kode Java dari algoritma ini adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
penyusunan ulang paket;
kelas publik Menyusun Ulang {
public static void main(String[] args) {
int[] daftar = { 1, 2, 3, 4, 5, 7, 9, 11 };
menyusun ulangOddEven(daftar);
}
public static void reorderOddEven(int[] daftar) {
int panjang = daftar.panjang;
untuk (int i = 0; i < panjang; i++) {
Sistem.keluar.cetak(daftar[i] + " ");
}
Sistem.keluar.cetak("/n");
int mulai = 0;
int ujung = panjang - 1;
while (mulai < akhir) {
sementara (mulai < akhir && (daftar[mulai] & 0x1) != 0)
mulai++;
sementara (mulai < akhir && (daftar[akhir] & 0x1) == 0)
akhir--;
jika (mulai < akhir) {
int temp = daftar[mulai];
daftar[mulai] = daftar[akhir];
daftar[akhir] = suhu;
}
}
untuk (int i = 0; i < panjang; i++) {
Sistem.keluar.cetak(daftar[i] + " ");
}
}
}