描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
示例1
输入:
[1,2,3,4]
返回值:
[1,3,2,4]
示例2
输入:
[2,4,6,5,7]
返回值:
[5,7,2,4,6]
解题思路
- 似曾相似的感觉,将所有满足某个条件的数移动数组指定位置区间,同时将不满足该条件的元素移动至数组另一部分,这不就是快速排序核心思想的一部分吗?因此有了如下解题方法:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
if(array==null || array.length==0){
return array;
}
int left=0;
int right=array.length-1;
while(left<right){
// 跳过所有奇数
while(array[left]%2!=0){
left++;
}
// 跳过所有偶数
while(array[right]%2==0){
right--;
}
if(left<right){
int temp=array[left];
array[left]=array[right];
array[right]=temp;
}
}
return array;
}
}
Tips: 上述解题方法并不能满足题意,调整后元素位置后并不改变原有元素的相对位置(快速排序是一个不稳定的排序方法)。
- 为解决上述问题,去寻找一个一个分治算法可以用于排序同时又是稳定排序——归并排序
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
if(array==null || array.length==0){
return array;
}
int[] data=new int[array.length];
mergeReOrderArray(array,data,0,array.length-1);
return array;
}
public void merge(int[] array,int[] data,int left,int mid,int right){
int i=left;
int j=mid+1;
int k=left;
// 先判断下标是否越界再取值
while(i<=mid && array[i]%2!=0){
data[k++]=array[i++];
}
// 先判断下标是否越界再取值
while(j<=right && array[j]%2!=0){
data[k++]=array[j++];
}
while(i<=mid){
data[k++]=array[i++];
}
while(j<=right){
data[k++]=array[j++];
}
for(int index=left;index<=right;index++){
array[index]=data[index];
}
}
public void mergeReOrderArray(int[] array,int[] data,int left,int right){
// 只剩下1个元素时自然有序
if(left>=right){
return;
}
int mid=left+(right-left)/2;
mergeReOrderArray(array,data,left,mid);
mergeReOrderArray(array,data,mid+1,right);
merge(array,data,left,mid,right);
}
}