java多线程实现归并排序_利用多线程对数组进行归并排序

本文介绍了一种使用Java多线程优化归并排序的方法,将数组等分后由多个线程独立排序,再进行归并,提高排序效率。通过MoreThreads类和MyThread类实现线程同步,并利用CountDownLatch等待所有线程完成后再进行归并,适用于不同线程数量和数组长度的场景。
摘要由CSDN通过智能技术生成

多线程处理归并排序的方法一般为:

假设有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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值