13、调整数组顺序使奇数位于偶数前面
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:
1:借助辅助两个数组,时间复杂度O(2n),空间复杂度O(n)
// 思路1
public void reOrderArray1(int [] array) {
if(array==null){
return;
}
ArrayList<Integer> jishu =new ArrayList<>();
ArrayList<Integer> oushu = new ArrayList<>();
for(int i=0;i<array.length;i++){
if(array[i]%2==0){
oushu.add(array[i]);
}else{
jishu.add(array[i]);
}
}
for(int i=0;i<jishu.size();i++){
array[i]=jishu.get(i);
}
for(int i=0;i<oushu.size();i++){
array[jishu.size()+i]=oushu.get(i);
}
}
2:在原数组上操作,每碰到奇数与前一位置比较,交换位置,直到目的地。
时间复杂度O(n^2)或O(nlogn) ,空间复杂度O(1)
// 思路2
public void reOrderArray2(int [] array) {
if(array==null){
return;
}
for(int i=0;i<array.length;i++){
if(array[i]%2!=0){
int p = i-1;
while(p>=0){
if(array[p]%2==0){
// 前一位是偶数,交换值
int temp =array[p+1];
array[p+1]=array[p];
array[p]=temp;
p--;
}else{
break;
}
}
}
}
}