归并排序(Merge Sort)采用了经典的分治(divide-and-conquer)策略,并且具有并行的特征的。在多处理器环境下,使用多线程能够有效的提高归并排序的效率。更多的细节可以参考排序算法之多线程实现。
然而在分治策略中,每个任务只需要简单而常规的同步和管理,只有在等待子任务时才会被阻塞。在Java的JUC包中,Fork/Join框架充分利用了Fork/Join程序的简单性、规律性以及相关约束,对Fork/Join程序进行了很好的优化,更多的细节可以参考Java的Fork/Join框架。
使用多线程的归并排序Java代码
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MergeSortWithMultithread {
/**
* 将给定数组排序(多线程,归并排序)
*
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组 排序后的数组
*/
private static ExecutorService pool;
public static int[] sort(final int[] arr) {
if (arr == null) {
return null;
}
if (pool == null || pool.isShutdown()) {
pool = Executors.newCachedThreadPool();
}
int[] res = sort(arr, 0, arr.length - 1, 0);
pool.shutdown();
pool = null;
return res;
}
private static int[] sort(final int[] arr, int start, int end, int k) {
if (start > end) {
return new int[]{
};
}
if (start == end) {
return new int[]{
arr[start]};
}
if ((k >= 6) || (end - start <= 1000)) {
int[] res = Arrays.copyOfRange(arr, start, end + 1);
Arrays.sort(res);
return res;
}
int mid &#