1.题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
1.剑指offer上面的方法不能保证奇数奇数,偶数偶数的相对位置不改变
2.之前自己用的都是冒泡排序,但显然时间复杂度不好,这次利用归并排序重写了算法,利用空间换时间
2.code实现(已a)
public class Solution {
public void reOrderArray(int [] array) {
if(array==null || array.length==0)
return;
mergeSort(array,0,array.length-1);
}
//归并排序
private void mergeSort(int[] array,int low,int high){
if(low>=high)
return;
int mid=(low+high)/2;
mergeSort(array,low,mid);
mergeSort(array,mid+1,high);
merge(array,low,mid,high);
}
private void merge(int[] array,int low,int mid,int high){
int[] tmp=new int[high-low+1];
int idx=0;
//low到mid找奇数
for(int i=low;i<=mid;i++){
if((array[i]&1)==1){
tmp[idx++]=array[i];
}
}
//mid+1到high找奇数
for(int i=mid+1;i<=high;i++){
if((array[i]&1)==1){
tmp[idx++]=array[i];
}
}
//low到mid找偶数
for(int i=low;i<=mid;i++){
if((array[i]&1)==0){
tmp[idx++]=array[i];
}
}
//mid+1到high找偶数
for(int i=mid+1;i<=high;i++){
if((array[i]&1)==0){
tmp[idx++]=array[i];
}
}
//拷贝tmp数据到array
for(int i=0;i<tmp.length;i++){
array[low++]=tmp[i];
}
}
}