一、使用辅助数组
使用两个辅助数组,一个用来存偶数,一个用来存奇数,时间复杂度O(n),代码如下:
if (array==null||array.length==0)
return;
//解法1:排序+额外空间
LinkedList<Integer> oddList=new LinkedList<>();
LinkedList<Integer> evenList=new LinkedList<>();
for (int item:array){
if ((item&1)==0)
evenList.add(item);
else
oddList.add(item);
}
int p=0;
for (int i:oddList)
array[p++]=i;
for (int i:evenList)
array[p++]=i;二、双指针
利用双指针,p1遇到偶数先停下来,p2向后移动,直到遇到奇数,将奇数换到前面,然后将p1和p2之间的数字整体后移。代码如下:
if (array==null||array.length==0)
return;
int p1=0,p2=0;
while (true){
//找到第一个偶数,停下来
for (;p1<array.length;++p1){
if ((array[p1]&1)==0)
break;
}
//找到第一个奇数,停下来
for (p2=p1+1;p2<array.length;++p2){
if ((array[p2]&1)==1)
break;
}
if (p1==array.length||p2==array.length)
break;
//将p1-p2之间的数据整体往后移
int tmp=array[p2];
for (int i=p2;i>p1;--i){
array[i]=array[i-1];
}
array[p1]=tmp;
}
京公网安备 11010502036488号