在Java中,我有一个正数不同的数字列表。
每个数字都用作以下代码中使用的哈希集IntIntHashSet fs
和cs
中的键,以检索某些条件值。
然后我检查条件(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 交换方法会更快吗?
[编辑] :我可能有一个包含数千个数字的很长的列表。由于例子,上面的一个很简单。
答案 0 :(得分:1)
对于部分排序数组和小数据集,冒泡排序将是有效的方式。 quicksort只对大(大)数据集有效。您似乎正在实施冒泡排序,这对于小型数据集就足够了。
检查here以了解不同排序算法的效率。
答案 1 :(得分:0)
使用Java,除非您对其进行基准测试和广泛分析,否则您无法知道。
一些适用于小型集合的代码可能对较大的集合而言更糟糕,反之亦然。取决于何时优化,以及具有哪些先决条件。它可以识别XOR可以在机器代码中有效编码的方式,或者它可以以不同方式编码。 它甚至可能因客户端和服务器VM而异。
事实上,Java中的sort
集合方法已经从JDK 6替换为JDK 7(从IIRC Quicksort到TimSort,一个来自Python IIRC的混合就地合并程序)。
就在这些日子里,我一直在战斗的情况下,逻辑上只有必须更快,但任何基准显示相反,这只能通过JIT优化由于不同而执行不同来解释热点。效率较低的代码显然触发了更好的优化。