题目描述
情况1:
不需要保证偶数的相对位置
可以从第0个和第len-1开始,时间复杂度为O(n),不计算交换的时间的话。
代码:
public static void reOrderArray2(int [] array)
{
int n=array.length;
if (n == 0 || n == 1)
return;
int i = 0, j = n - 1;
int temp;
while (i < j)
{
if ((array[i] & 1) == 1) //是奇数
{
i++;
continue;
}
if ((array[j] & 1) == 0)
{
j--;
continue;
}
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
情况2:需要保证偶数的相对位置
可以创建两个数组分别保存奇数和偶数,然后分别复制到数组中即可。时间复杂度O(2n),不过空间需要增加两倍。
代码;
public static void reOrderArray(int [] array)
{
int len=array.length;
if(len==0||len==1)
{
return;
}
int[] a=new int[len];
int[] b=new int[len];
int count1=0;
int count2=0;
for(int i=0;i<len;i++)
{
//if(array[i]&1==0)
if(array[i]%2!=0)
a[count1++]=array[i];
else
b[count2++]=array[i];
}
for(int i=0;i<count1;i++)
{
array[i]=a[i];
}
for(int i=0;i<count2;i++)
{
array[i+count1]=b[i];
}
}
方法2:
每次找到一个偶数就将其保存起来,将后面的数向前移动,然后将该偶数放到最后位置上上,时间复杂度为O(n*n).