【发布时间】:2014-01-22 05:29:40
【问题描述】:
我编写了一个程序,将数组的所有偶数元素放在数组的左边,奇数元素放在数组的右半边。元素的顺序无关紧要。我想知道是否有比这更有效的算法。我最坏的情况复杂度是 O(n/2)。这是代码。
// Program to shift all even numbers in an array to left and odd to the right. Order of digits is not important.
import java.util.*;
import java.lang.*;
import java.io.*;
class Rearrange
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
int[] array = new int[] {1,2,3,4,5,6,7};
// keep two pointers.
int odd, even;
odd = 0;
even = array.length-1;
int i;
// Code to re-arrange the contents of the array
i=0;
while(i<array.length){
if(array[i]%2!=0){
odd = i;
break;
}
i++;
}
i=array.length-1;
while(i>=0){
if(array[i]%2==0){
even = i;
break;
}
i--;
}
while(odd<even){
if((array[odd]%2!=0) && (array[even]%2==0)){
// swap contents
array[odd] = array[odd] + array[even];
array[even] = array[odd] - array[even];
array[odd] = array[odd] - array[even];
odd++;
even--;
}
else if(array[odd]%2==0){
odd++;
}
else if(array[even]%2!=0){
even--;
}
else
continue;
}
for(int val : array)
System.out.println(val+" ");
}
}
【问题讨论】:
-
请注意,O(n / 2) 与 O(n) 相同。 Big-O 表示法忽略常数因子。
-
% 是一个相当昂贵的操作,您可以使用以下语法代替: if (x & 1)odd=1; if (!(x & 1)) even=1;
-
非常不寻常的交换方式。在一般情况下,您必须注意这些值不会导致溢出。
-
您也可以使用异或交换来避免溢出:
a=a^b;b=a^b;a=a^b