簡體   English   中英

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

[英]Fastest way to sort and swap elements in Java

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

雖然我不太確定,但它看起來像是冒泡的 我正在編寫一個耗時的程序,這部分應該盡可能優化。

主要問題 :使用其他排序方法(如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM