剑指offer---13---(排序,快排思想)---调整数组顺序使奇数位于偶数的前面
题意
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。相对位置不改变。
分析
思路1:
因为偶数都要放到最后面去,所以出现一个偶数就放到最后,同时移动剩余的部分往前一位,这样能够保证相对位置不发生改变。O(n^2)
思路2:
先找到一个偶数,偶数要往后面放嘛,所以从偶数开始往后面找奇数,找到了就把奇数提前放在偶数的位置,因为找到的奇数是该偶数之后第一个奇数,所以奇数和偶数之间都是必须后移动一位的。
代码:
public class Solution {
public void reOrderArray(int [] array) {
if (array == null || array.length <= 1) return;
int first = 0;
int second = 0;
//这边为什么使用while不用for,因为不是一步一步跳的,而是可以直接到末尾的。while用于不断后移动的操作。
while (first < array.length) {
while (first < array.length && isOdd(array[first])) {
first ++;
}
if (first >= array.length - 1) {
break;
}
second = first + 1;
while (second < array.length && !isOdd(array[second])) {
second ++;
}
if (second > array.length - 1) {
break;
}
int temp = array[second];
for (int i = second - 1; i >= first; i--) {
array[i + 1] = array[i];
}
array[first] = temp;
}
}
public boolean isOdd(int num) {
return (num & 1) == 1;
}
}