13. 调整数组顺序使奇数位于偶数前面
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
- 使用辅助队列
遍历数组,奇数偶数分别入队列,再先后将奇偶队列中的元素初队列写入原数组。 - 不使用辅助队列
类比插入排序的思想。
代码实现
- 使用辅助队列
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
// 解法一: 使用辅助队列
public void reOrderArray(int [] array) {
Queue<Integer> qOdd = new LinkedList<Integer>();// 奇数队列
Queue<Integer> qEven = new LinkedList<Integer>();// 偶数队列
// 遍历数组
for (int i = 0; i < array.length; i++){
if (array[i] % 2 == 0){ // 若为偶数
qEven.offer(array[i]);
}
else{// 若为奇数
qOdd.offer(array[i]);
}
}
int i = 0;
for (;!qOdd.isEmpty();i++){
array[i] = qOdd.remove();
}
for(;!qEven.isEmpty();i++){
array[i] = qEven.remove();
}
}
}
- 不使用辅助队列
public void reOrderArray_2(int [] array) {
int i = 0;
int j = 0;
for (;i < array.length; i++) {
if (array[i]%2 == 0){// i指向偶数
for (j = i+1; j < array.length && array[j]%2 == 0;j++); // 让j指向i后第一个奇数
if (j == array.length)
{
break;
}
int tmp = array[j];
int loc = j;
for (;j > i;j--){// 将偶数部分后移
array[j] = array[j-1];
}
array[i] = tmp; //奇数前移
//i = loc;
}
}
}