时间:2016-01-20 06:26:19

标签: java algorithm data-structures

我试图在一次通过时分别将偶数和奇数分别左右分开。此外,我想确保这些数字按照asc顺序排序,这样整个逻辑将具有O(n)的复杂性。

例如,如果我的输入是{9,8,2,3,11,10,1};

这个逻辑我实现了o / p为{10 8 2 3 11 9 1}但我想确保我的输出在同一个传递中被排序为{2,8,10,1,3,9,11}。

static void segregateEvenOdd(int arr[]) {
    /* Initialize left and right indexes */
    int left = 0, right = arr.length - 1;
    while (left < right) {
        /* Increment left index while we see 0 at left */
        while (arr[left] % 2 == 0 && left < right)
            left++;

        /* Decrement right index while we see 1 at right */
        while (arr[right] % 2 == 1 && left < right)
            right--;

        if (left < right) {
            /* Swap arr[left] and arr[right] */
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }
}

5 个答案:

答案 0 :(得分:2)

使用允许您传递Comparator的{​​{3}}。比较函数应该类似于下面(伪代码):

Comparison(a, b)
{
    if (Even(a) && !Even(b))
        return -1; // a < b
    if (Even(b) && !Even(a))
        return 1; // a > b
    // both are even, or both are odd.
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
}

答案 1 :(得分:0)

使用比较整数排序算法,最佳算法可以在O(nlgn)中进行,因此您无法使用比较整数排序来实现O(n)

您可以做的是:您可以使用非比较整数排序算法。喜欢:

这将在O(n)中对您的数组进行排序,并在输入中添加一些条件。 有关详细信息,请参阅一些示例

答案 2 :(得分:0)

一次通过是不可能的。你真的有两种不同的排序。一个用于偶数,一个用于赔率。

这是我的建议。

  

解决方案1。

如果允许引入新的数据结构,请采用以下方法 创建两个ArrayList(一个甚至一个用于奇数)将它们相应地分开。在两者上运行Collections.Sort。迭代地重新填充您的初始数组。

  

解决方案2.

使用上面的方法正确分隔均衡和赔率。计算列表中的平均数。构建一个典型的排序例程,如mergesort,并在数组的两个不同段上调用例程。以上示例将被称为

merge(arr, 0, 2);
merge(arr, 3, 6);

这两种解决方案都具有总体时间复杂度:O(nlogn)。空间复杂度:O(n)。解决方案一更容易实现,但解决方案二允许您进行更多就地排序。其他排序例程具有最佳情况O(n)时间但不保证它。

答案 3 :(得分:0)

我会使用快速排序或任何其他标准算法,但定义元素之间的比较为:a小于b如果a为偶数且{{1} }是奇数,或者它们都是偶数或奇数b

这不会给你O(n),这是不可能的,但通过重复使用众所周知的算法将获得最大的性能。

答案 4 :(得分:0)

您还可以使用列表:

List<Integer> list = Arrays.asList(yourArray);
Collections.sort(list, new Comparator<Integer>() {
       public int compare(Integer a, Integer b) {
                return a%2 - b%2;
       }
}