如何为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