调整数组顺序使奇数位于偶数前面
描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
分析
- 这里很容易联想到快速排序基于中间值,左右两边基本有序的方法。但是快速排序是一个不稳定算法,会改变数与数之间的位置,虽然能满足题干的前半部分,但是满足不了条件—并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 考虑其他的排序方法中,维持一个队列有序的稳定排序方法—插入排序
代码
//这是一个错误的解决方式,使用快速排序
public static void reOrderArrayError(int[] array) {
if (array == null || array.length == 0 || array.length == 1) {
return;
}
int temp = array[0];
int i = 0, j = array.length - 1;
while (i < j) {
while (i < j && array[i] % 2 == 1) {
i++;
}
if (i < j) {
array[j] = array[i];
}
while (i < j && array[j] % 2 == 0) {
j--;
}
if (i < j) {
array[i] = array[j];
}
}
array[i] = temp;
}
//插入排序
public static void reOrderArray(int[] array) {
if (array == null || array.length == 0 || array.length == 1) {
return;
}
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 1) {
int j = i - 1;
int temp = array[i];
while (j >= 0 && array[j] % 2 == 0) {
array[j + 1] = array[j];
j--;
}
array[j+1] = temp;
}
}
测试
public void testReOrderArray() {
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
int[] curArray = { 1, 3, 5, 7, 2, 4, 6 };
Number.reOrderArray(array);
for (int i = 0; i < array.length; i++) {
assertEquals(array[i], curArray[i]);
// Log.d("TAG", array[i]+" ");
}
}
时间: 2024-11-23 15:26:29