【问题标题】:Rearrange even and odd in an array重新排列数组中的偶数和奇数
【发布时间】: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

标签: java arrays algorithm


【解决方案1】:

对于任何没有足够数据结构信息的算法,你不能在小于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--;

  }

} 

【讨论】:

    【解决方案2】:

    我看不出你的代码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];
        }
    

    【讨论】:

    • 应该是j--,不是j++
    猜你喜欢
    • 2016-06-13
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2016-04-25
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多