[英]Fastest way to sort and swap elements in Java
在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;
}
}
雖然我不太確定,但它看起來像是冒泡的 。 我正在編寫一個耗時的程序,這部分應該盡可能優化。
主要問題 :使用其他排序方法(如QuickSort)會更快嗎?
第二個問題:在沒有臨時變量swap
情況下使用xor交換方法會更快嗎?
[編輯] :我可能有一個很長的列表,包含數千個數字。 上面的例子由於示例而很簡單。
對於部分排序的數組和少量數據,氣泡排序是一種有效的方法。 快速排序僅對大(大)數據集有效。 您似乎正在實現冒泡排序,這對於少量數據就足夠了。
在此處檢查不同分類算法的效率。
使用Java,您需要進行廣泛的基准測試和分析,然后才能知道。
某些適用於小型集合的代碼可能不適用於大型集合,反之亦然。 取決於何時對其進行優化以及具有哪些前提條件。 它可能會認識到可以在機器代碼中高效編碼XOR的方式,也可能會對此進行不同的編碼。 客戶端和服務器VM之間甚至可能有所不同。
實際上,Java中集合的sort
方法已從JDK 6替換為JDK 7(從IIRC Quicksort到TimSort,這是來自Python IIRC的混合就地合並排序)。
就在這些日子里,我一直在努力解決一個邏輯上必須更快的情況,但是任何基准測試都顯示出相反的情況,這只能通過由於熱點不同而對JIT優化執行的方式不同來解釋。 效率較低的代碼顯然引發了更好的優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.