有没有办法更优雅地将数组排序为偶数和赔率?

时间:2016-01-19 22:56:52

标签: java arrays sorting

我正在尝试对整数数组进行排序,使得所有偶数都在奇数之前,而不使用任何外部库。 您可以通过以下方式识别:http://codingbat.com/prob/p105771

" 返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便所有偶数都在所有奇数之前。除此之外,数字可以是任何顺序。您可以修改并返回给定的数组,或者创建一个新数组。" 我有完成此目标的代码:

    public int[] evenOdd(int[] nums) {
    int c=0;
    int c2=0;
    int [] nums2=new int[nums.length];
    for(int i=0;i<nums.length;i++)
    {
        if(nums[i]%2==0)
        {
            nums2[c]=nums[i];
            c++;
        }
        else
        {
            nums2[nums.length-c2-1]=nums[i];
            c2++;
        }
    }
    return nums2;
}

我也通过调用array.sort()然后按索引插入数字,递增2,然后插入余数来解决问题。这也有效。

所以,为了做一个简短的帖子 - 将来有更优雅的方式来实现这个目标吗? 谢谢!

3 个答案:

答案 0 :(得分:2)

只是我的评论的后续行动。以下是如何在没有额外空格的O(n)中执行此操作:

public class Main {
    public static void main(String[] args) {
        evenOdd(new int[]{1, 2, 3, 4, 5, 6, 7});
        evenOdd(new int[]{2, 3, 4, 5, 6, 7});
        evenOdd(new int[]{1, 1, 1, 1, 1});
        evenOdd(new int[]{2, 2, 2, 2});
    }

    public static void evenOdd(int[] a) {
        int firstOdd = 0;
        for (int i = 0; i < a.length; ++i) {
            if (a[i] % 2 == 0) {
                int t = a[firstOdd];
                a[firstOdd] = a[i];
                a[i] = t;
                firstOdd++;
//            } else {
//                else is redundant, just leave odd in-place
            }
        }
        System.out.println(Arrays.toString(a));
    }
}

答案 1 :(得分:1)

创建一个包含int的包装器对象,称之为SortingWrapper。此对象应实现Comparable,以使其自然排序顺序基于值%2的排序顺序。然后使用Arrays.sort()对数组进行排序。基于compareTo()实现,evens将自然地(即,根据它们的自然排序顺序)冒泡一种方式,所有的可能性将使另一方冒泡。

或者,你可以只使用Integers作为你的包装器并传递一个与Arrays.sort()做同样事情的Comparator。

编辑 - 这是一般的想法。你可能不得不玩排序顺序,但我认为这非常有效。我怀疑这个数组将算作&#34;大多数排序&#34;根据Arrays.sort()的javadoc,这将使性能更倾向于O(n)而不是log(n)。

public void sortOddsAndEvents(Integer[] input)
{
    Arrays.sort(input, new Comparator<Integer>()
    {
        @Override
        public int compare(Integer arg0, Integer arg1)
        {
            if (arg0.equals(arg1)) return 0;
            else return Integer.compare(arg0.intValue()%2, arg1.intValue()%2);
        }

    });
}

答案 2 :(得分:0)

public int[] evenOdd(int[] nums) {

  int evenCounter = -1, oddCounter = nums.length;
  int[] ordered = new int[nums.length];

  for (int i = 0; i < nums.length; i++) {

      int current = (nums[i] % 2 == 0) ? ++evenCounter : --oddCounter;
      ordered[current] = nums[i];
  }
  return ordered;
}