我编写了一个程序,将数组的所有偶数元素放在左边,将奇数元素放到数组的右半边。元素的顺序并不重要。我想知道是否有比这更有效的算法。我最糟糕的情况是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+" ");
}
}
答案 0 :(得分:2)
对于没有关于数据结构的足够信息的任何算法,你不能在O(N)
中进行,其中N是输入大小,因为如果你做得更快就意味着你没有考虑输入的一部分因此算法可能不正确。
以下是您的问题的就地代码: -
int i=0,j=n-1;
while(i<j) {
if(arr[i]%2==0) {
i++;
}
else {
swap(arr[i],arr[j]);
j--;
}
}
答案 1 :(得分:1)
我看不出您的代码O(N/2)
是怎样的。如果数组包含所有奇数或全部,则while循环中的一个将迭代所有n个元素。
您可以执行类似quick sort, pivot element being last element
之类的操作,而不是像check your criteria
那样分割代码,而不是像 int i = 0;
int j = arr.length -1;
while(i < j){
if(arr[i]%2 != 0){
i++;
}
if(arr[j]%2 == 0){
j--;
}
//swap
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
}
那样分离小于和大于{{1}}。
{{1}}