题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
分析
思路一:
利用辅助数组,以空间换时间
代码:
public class Solution {
public void reOrderArray(int [] array) {
int[] res = new int[array.length];
int j = 0;
for(int i = 0; i < array.length; i++) {
if((array[i] & 1) == 1) {
res[j++] = array[i];
}
}
for(int i = 0; i < array.length; i++) {
if((array[i] & 1) == 0) {
res[j++] = array[i];
}
}
for(int i = 0; i < array.length; i++) {
array[i] = res[i];
}
}
}
思路二:
代码:
public class Solution {
public void reOrderArray(int [] array) {
if(array.length <= 1) {
return;
}
//i~j位置为偶数
int len = array.length;
int i = 0;
while(i < len) {
int j = i + 1;
if((array[i] & 1) == 0) {//i位置为偶数,j前进,直到为奇数,替换
while((array[j] & 1) == 0) {//j位置为偶数
if(j == len - 1) return;
j++;
}
//j位置为奇数,则需要把j位置的数插入到i之前
int cnt = j - i;
int tmp = array[i];
array[i] = array[j];
while(cnt > 1) {
array[i + cnt] = array[i + cnt - 1];
cnt--;
}
array[i + 1] = tmp;
}
i++;
}
}
}
思路三:
归并排序
代码:
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 - low) >> 1);
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];
}
}
}