您的位置:首页 > Web前端

【剑指offer】调整数组顺序使奇数位于偶数前面

2016-08-09 16:16 260 查看
题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

这道题第一思路自然是这样的:从头开始遍历这个数组,如果遇到偶数就把这个数之后的所有数往前移动一位,这样数组会留出一个空位,移动完毕之后把该偶数放到该空位即可。这样处理的话需要两次循环,一次是遍历,另一次是移位,所以时间复杂度是O(n2)。

package com.gpl.offer.jianzhi;

/**
* Created by gpl on 2016/8/9.
*/
public class ReOrderArrayOddEvenOdd { //调整数组顺序使奇数位于偶数前面

public int[] reOrderArray(int[] array){ //允许改变相对位置
if(array == null || array.length == 0)
return null;
int begin = 0;
int end = array.length-1;
while(begin < end){
while(!isEven(array[begin]) && begin<end)
begin++;
while(isEven(array[end]) && begin<end)
end--;
if(begin < end){
swap(array,begin,end);
}
}
return array;

}

private boolean isEven(int n){ //判断是否是偶数
if((n & 0x1 )==0)
return true;
return false;
}

private void swap(int[] array,int i,int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}

public static void main(String[] args){
ReOrderArrayOddEvenOdd roaoe = new ReOrderArrayOddEvenOdd();
int a[] = {1,2,3,4,5,6,7,8,9};
int array[] = roaoe.reOrderArray2(a);
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}

public int[] reOrderArray2(int[] array){ //不允许改变相对位置
if(array == null || array.length ==0)
return null;
int j;
for(int i=1;i<array.length;i++){
int temp = array[i];
if(!isEven(array[i])){
for(j=i-1;j>=0 && isEven(array[j]);j--){
array[j+1] = array[j];
}
array[j+1] = temp;
}
}
return array;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: