【题目描述】
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变
【解决方法】
方法一:辅助数组
采用辅助数组的方式,将奇偶数分别保存到辅助数组
- (1)先统计奇数个数;
- (2)遍历原数组,如果是奇数,放在辅助数组开头;如果是偶数,从辅助数组奇数个数位置开始存放
- (3)将辅助数组copy到原数组上
public class Solution {
public void reOrderArray(int [] array) {
int odd = 0; // 奇数个数
int start = 0; // 起始位置
int count = array.length;
// 统计奇数个数
for(int i =0;i<count;i++){
if((array[i]&1)==1)
odd++;
}
int []a = new int[count];
for(int i=0;i<count;i++){
if((array[i]&1)==1){
// array[i]为奇数
a[start] = array[i];
start++;
}else{
// array[i]为偶数
a[odd] = array[i];
odd++;
}
}
for(int i =0;i<a.length;i++){
array[i] = a[i];
}
}
}
方法二:排序思想:冒泡法
public class Solution {
public void reOrderArray(int [] array) {
boolean changed = true;
for (int i=0;i<array.length && changed;i++){
changed = false;
for (int j=0;j<array.length-1-i;j++){
// 左边是奇数,右边是偶数的情况交换
if ((array[j]&1)==0 && (array[j+1]&1)==1){
changed = true;
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
}
方法三:排序思想:插入法
public class Solution {
public void reOrderArray(int [] array) {
int j,key;
for (int i=1;i<array.length;i++){
key = array[i];
if ((key&1)==0) continue;// 如果是偶数的话跳过
j = i-1;
while (j>=0 && (array[j]&1)==0){
// 找到奇数位置
array[j+1] = array[j];
j--;
}
array[j+1] = key;
}
}
}