在Java中排序和交换元素的最快方法

时间:2012-09-25 22:39:15

标签: java swap quicksort bubble-sort

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

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

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

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

主要问题:使用其他排序方法(如 QuickSort )会更快吗?

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

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

2 个答案:

答案 0 :(得分:1)

对于部分排序数组和小数据集,冒泡排序将是有效的方式。 quicksort只对大(大)数据集有效。您似乎正在实施冒泡排序,这对于小型数据集就足够了。

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

答案 1 :(得分:0)

使用Java,除非您对其进行基准测试和广泛分析,否则您无法知道。

一些适用于小型集合的代码可能对较大的集合而言更糟糕,反之亦然。取决于何时优化,以及具有哪些先决条件。它可以识别XOR可以在机器代码中有效编码的方式,或者它可以以不同方式编码。 它甚至可能因客户端和服务器VM而异。

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

就在这些日子里,我一直在战斗的情况下,逻辑上只有必须更快,但任何基准显示相反,这只能通过JIT优化由于不同而执行不同来解释热点。效率较低的代码显然触发了更好的优化。