在多个线程中划分合并排序算法

时间:2015-12-21 14:32:43

标签: java multithreading algorithm sorting mergesort

我打算构建一个在Java中使用多个线程的合并排序算法,我已经浏览了互联网和SO(例如Multi-threading a merge sorting algorithm),但我似乎无法解决我的一些问题。

首先,创建的最佳线程数是否与CPU的内核数相同?在考虑线程数时,我是否应该考虑逻辑核心?

其次,在这种算法中实现多线程的最佳方法是什么?我听说有不止一种方法(比如继承“Thread”类或使用implements Runnable等。)。

此外,在优化方面,使用ArrayLists或LinkedLists是更好的选择吗?

赞赏有关实施的任何其他说明/建议。

干杯。

2 个答案:

答案 0 :(得分:3)

在Java 8中,如果您请求Arrays.parallelSort()的并行性,则流API也会使用parallelStreamparallelSort的来源应该是非常有用的,如果您出于教育目的而对此进行调查。

答案 1 :(得分:1)

  

...创建的最佳线程数是否与CPU的内核数相同?

我会这么认为。合并排序应该是内存带宽有限,而不是cpu带宽限制。早期多线程的主要好处是利用每个核心的本地缓存,通常是1级和2级缓存。通常,级别3高速缓存在核心之间共享,因此,如果合并过程相对于3级高速缓存的速度相对CPU受限,那么唯一的增益就是。一旦运行规模变得足够大以超过缓存限制,那么我不确定从多线程中获得多少。

Microsoft的stable_sort首先使用插入排序来创建32个元素的已排序组,这可能是为了利用本地缓存。我不确定这对当前的处理器是否真的有帮助,因为它基于1994年编写的代码。