【问题标题】:Fastest way to sort and swap elements in Java在 Java 中排序和交换元素的最快方法
【发布时间】:2012-09-17 12:18:11
【问题描述】:

在 Java 中,我有一个不同正数的列表。

每个数字都用作哈希集 IntIntHashSet fscs 中的一个键,在下面的代码中用于检索一些条件值。 然后我检查条件(if 语句),如果为真,则交换元素。

int[] list = // given list of positive different ints like [14, 2, 7, 19, 20, 3]
int l = list.length;
if (l > 1) {
    int elI, elJ, fI, fJ, swap;
    for (int i = 0; i < l; i++) {
        boolean swapped = false;
        for (int j = 1; j < l; j++) {
            elI = list[j - 1];
            elJ = list[j];
            fI = fs.get(elI);
            fJ = fs.get(elJ);
            if (fI > fJ || (fI == fJ && cs.get(elI) > cs.get(elJ))) {
                swap = list[j];
                list[j] = list[j - 1];
                list[j - 1] = swap;
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}

它看起来像 冒泡 排序,虽然我不太确定。我正在编写一个耗时的程序,这部分应该尽可能优化。

主要问题:使用像 QuickSort 这样的其他排序方法会更快吗?

第二个问题:在没有临时变量swap的情况下使用xor交换方法会更快吗?

[编辑]:我可能有一个很长的列表,其中包含数千个数字。上面的例子很简单。

【问题讨论】:

    标签: java swap quicksort bubble-sort


    【解决方案1】:

    对于部分排序的数组和少量数据,冒泡排序将是一种有效的方法。快速排序仅对大型(巨大)数据集有效。您似乎正在实施冒泡排序,这对于少量数据集已经足够了。

    检查here 了解不同排序算法的效率。

    【讨论】:

      【解决方案2】:

      使用 Java,除非您对它进行广泛的基准测试和分析,否则您不会知道。

      一些适用于小集合的代码可能对大集合效果更差,反之亦然。取决于何时优化,以及有哪些先决条件。它可能会识别 XOR 可以在机器代码中有效编码的方式,或者它可能会以不同的方式对其进行编码。 它甚至可能在客户端和服务器 VM 之间有所不同。

      事实上,Java 中用于集合的 sort 方法已从 JDK 6 替换为 JDK 7(从 IIRC Quicksort 到 TimSort,这是一种来自 Python IIRC 的混合就地合并排序)。

      就在这几天,我一直在与一种情况作斗争,从逻辑上讲,必须更快,但任何基准测试都显示相反的结果,这只能通过 JIT 优化由于不同而执行不同来解释热点。而效率较低的代码显然触发了更好的优化。

      【讨论】:

        猜你喜欢
        • 2011-06-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 1970-01-01
        相关资源
        最近更新 更多