多线程处理归并排序的方法一般为:
假设有n个线程同步处理,就将数组等分成n份,每个线程处理一份,再对最后n个有序数组进行归并。
为了使对整个算法具有可扩展性,即线程数n可以自定义,笔者将线程类、处理数组类等进行封装,分为最主要的4个类:Array, Merge, MyThread, MoreThreads,代码如下:
/*Array.java*/
import java.util.ArrayList;
/**
* @author duyue
*
* 这个类用来处理数组
*
* 原理:
* 创建待排序数组成功后,需要配合多线程(假设有n个线程)分别排序,
* 需要将数组尽量等分成n个分数组(保存到列表中),由n个线程分别归
* 并排序,并将各个有序数组(再次保存到列表中),最后整合(不归并
* 整合)并覆盖原数组,等待最后归并。
*/
class Array {
/**
* 构造一个保存数组的列表,用于保存分割后的分数组
*/
static ArrayList arrayList = new ArrayList();
/**
* @param length 数组长度
* @return 待排序的数组
*/
static int[] createArray(int length) {
int[] array = new int[length];
for (int i = 0; i < length; i++) {
array[i] = (int) (Math.random() * 10000);
}
return array;
}
/**
* @param array 待分割(多线程排序需要)的数组
* @param num 线程数,即要分割的份数
*/
static void divideArray(int[] array, int num) {
int k = 0; //记录原数组的复制进度,k代表当前数组的复制初始点
for (int i = 0; i < num; i++) {
int point = array.length / num; //分数组的长度
int[] a = new int[0]; //保存分数组
/*考虑到不够整除的情况,将剩余的项全部放在最后一个分数组中*/
if (i != num - 1) a = new int[point];
if (i == num - 1) a = new int[array.length - k];
/*将array[k, k + a.length -1]复制到a[0, a.length]