给定一个数组,将数组里的偶数要在奇数前面,要求时间复杂度位O(n)
例如: 输入 data = { 1 ,2 ,3 ,4,5,6,7,8,9,0,13}
输出 data={0,2,8,4,6,5,7,3,9,1,13}
备注:仔细观察输入和输出,仅仅是将前面的奇数和后面的偶数交换相对位置,
思路就是,从前往后找奇数,从后往前找偶数,将找到的第一个奇数和偶数进行位置交换,依次向中间查找,直到前面的索引大于等于后面的索引为止。
1、时间复杂度为O(n),空间复杂度为O(1)
/**
* 使用while的方式
* 时间复杂度为O(n),空间复杂度为O(1)
*
* @param data
* @return
*/
public int[] useWhileOn(int[] data) {
// 头索引
int headIndex = 0;
// 尾索引
int tailIndex = data.length - 1;
// 从头到尾
while (headIndex < tailIndex ) {
// 找到前面奇数索引时
if (isOddNumber(data[headIndex])) {
// 找到后面偶数索引时
if (isEvenNumber(data[tailIndex])) {
// 奇偶交换位置,前后交互位置
swap(data, headIndex, tailIndex);
headIndex++;
}
// 直到找到偶数索引
tailIndex--;
} else {
// 直到找到奇数索引
headIndex++;
}
}
return data;
}
/**
* 使用for的方式
* 时间复杂度为O(n),空间复杂度为O(1)
*
* @param data
* @return
*/
public int[] useForOn(int[] data) {
int headIndex = 0;
int tailIndex = data.length - 1;
for (; headIndex < tailIndex; ) {
// 找到前面奇数索引时
if (isOddNumber(data[headIndex])) {
// 找到后面偶数索引时
if (isEvenNumber(data[tailIndex])) {