【问题标题】:Sort even and odd numbers in order按顺序排列偶数和奇数
【发布时间】:2016-04-25 21:06:37
【问题描述】:

我试图一次将偶数和奇数分别向左和向右隔离。另外,我想确保这些数字按 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--;
        }
    }
}

【问题讨论】:

  • 你的问题到底是什么?
  • 在 O(n) 中对数组进行排序 - 你是不是要求太多了?
  • 给定的数组是否已经排序?
  • 最好的排序算法——归并排序——给你 O(nlogn) 所以你不可能达到 O(n)
  • 我用示例编辑了我的问题。

标签: java algorithm data-structures


【解决方案1】:

使用Sort overload,让您传递Comparator。比较函数应该如下所示(伪代码):

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;
}

【讨论】:

    【解决方案2】:

    你也可以使用列表:

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

    【讨论】:

      【解决方案3】:

      使用比较整数排序算法最好的算法可以在O(nlgn) 中完成,因此您无法使用比较整数排序实现O(n)

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

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

      【讨论】:

        【解决方案4】:

        这是不可能一次性完成的。你真的有两种不同的类型。一个用于偶数,一个用于赔率。

        这是我的建议。

        解决方案 1。

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

        解决方案 2。

        使用上述方法正确区分偶数和赔率。计算列表中的偶数。构建一个典型的排序例程,如合并排序,并在数组的两个不同段上调用该例程。上面的例子会被称为

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多