forkjoin实现的归并排序
作者:互联网
forkjoin实现的归并排序
import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
* forkjoin实现的归并排序
*/
public class FkSort {
private static class SumTask extends RecursiveTask<int[]>{
private final static int THRESHOLD = 16;
private int[] src;
public SumTask(int[] src) {
this.src = src;
}
@Override
protected int[] compute() {
if(src.length <= THRESHOLD){
return InsertionSort.sort(src);
}else{
//fromIndex....mid.....toIndex
int mid = src.length / 2;
SumTask leftTask = new SumTask(Arrays.copyOfRange(src, 0, mid));
SumTask rightTask = new SumTask(Arrays.copyOfRange(src, mid, src.length));
invokeAll(leftTask,rightTask);
int[] leftResult = leftTask.join();
int[] rightResult = rightTask.join();
return MergeSort.merge(leftResult,rightResult);
}
}
}
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool();
int[] src = MakeArray.makeArray();
SumTask innerFind = new SumTask(src);
long start = System.currentTimeMillis();
int[] invoke = pool.invoke(innerFind);
// for(int number:invoke){
// System.out.println(number);
// }
System.out.println(" spend time:"+(System.currentTimeMillis()-start)+"ms");
}
public class MakeArray {
//数组长度
public static final int ARRAY_LENGTH = 40000000;
public final static int THRESHOLD = 47;
public static int[] makeArray() {
//new一个随机数发生器
Random r = new Random();
int[] result = new int[ARRAY_LENGTH];
for(int i=0;i<ARRAY_LENGTH;i++){
//用随机数填充数组
result[i] = r.nextInt(ARRAY_LENGTH*3);
}
return result;
}
}
}
标签:src,归并,java,int,private,import,排序,forkjoin 来源: https://blog.51cto.com/u_15193673/2850029