如何爲Java實現併發快速排序或合併排序算法?多線程快速排序或合併排序
我們在使用默認的Java排序算法只有一個核心(!)正在工作的16位(虛擬)核心Mac上出現了問題,而且,看到非常精細的機器完全不好充分利用。所以我們寫了自己的(我寫了它),並且確實獲得了很好的加速(我寫了一個多線程的快速排序,並且由於它的分區性質,它很好地並行化,但我也可以寫一個mergesort)多達4個線程,它是專有代碼,我寧願使用來自信譽良好的源代碼,而不是使用我重新發明的輪子。
唯一一個我在網上找到是不如何用Java編寫多線程快速排序的例子,它是忙循環(這實在太可怕了)使用:
while (helpRequested) { }
http://broadcast.oreilly.com/2009/06/may-column-multithreaded-algor.html
因此,除了無緣無故地丟失一個線程外,它還確保通過在while循環(這是令人驚歎的)中的忙循環來殺死perfs。
因此,我的問題:你知道任何正確的多線程quicksort或Java中的合併實現將來自信譽良好的源?
我強調了一個事實,即我知道複雜性保持O(n log n),但我仍然非常喜歡看到所有這些內核開始工作而不是空閒。請注意,對於其他任務,在同一個16個虛擬核心Mac上,我通過並行化代碼(我並不是指併發專家)加速到x7。所以即使艱難的複雜性保持O(n log n),我真的很感激x7或x8甚至x16的加速。
理想情況下,它是可配置的:你可以傳遞最小/最大數量的線程,你想讓你的多線程排序。 – SyntaxT3rr0r 2010-02-05 20:29:36
你真的需要一個多線程版本的quicksort嗎?如果要使用的線程數是k,請快速分區到k個陣列(選擇k-1個插槽),然後獨立調用您需要的任何類型。 – 2010-02-05 20:39:24
@Moron:但是獨立排序的分區不會被合併嗎? – 2010-02-05 20:43:21