package com.rationalcoding.sort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; /**
*
* @author Phani
*
* This is implementation of a multi threaded merge sort. First input
* array is divided into small chunks. Each chunk is sorted individually
* using Arrays.sort method which implements insertion sort Then all the
* chunks are merged in bottom up manner by doubling the width after
* each step
*
*/
public class MultiThreadedMergeSort extends SequentialMergeSort { private final int DEFAULT_POOL_SIZE = 100;
private final int DEFAULT_CHUNK_SIZE = 1000;
private ExecutorService pool = Executors.newFixedThreadPool(DEFAULT_POOL_SIZE);
private int[] arr; @SuppressWarnings("rawtypes")
@Override
public void sort(int[] arr) {
this.arr = arr; // handle null inputs
if (arr == null) {
throw new IllegalArgumentException("Input array cannot be null");
} if (arr.length == 0 || arr.length == 1) {
// already sorted return
return;
} // width is chunks we are diving the array into
int width = DEFAULT_CHUNK_SIZE;
if (width > 1) {
// apply insertion sort on chunks and then merge the chunks
ArrayList<Future> subTasks = new ArrayList<Future>();
for (int i = 0; i < arr.length; i = i + width) {
int start = i;
int end = i + width;
if (end > arr.length) {
end = arr.length;
}
// add the runnables to pool
subTasks.add(pool.submit(new InsertionSortRunnable(start, end)));
} // wait for the tasks to finish
// join all the threads to main thread
for (Future f : subTasks) {
try {
f.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
} // apply merging on already sorted chunks
for (; width < arr.length; width = width * 2) {
ArrayList<Future> tasks = new ArrayList<Future>();
for (int i = 0; i < arr.length; i = i + 2 * width) {
int rStart = i;
int rEnd = i + width - 1;
int lEnd = i + 2 * width - 1;
if (lEnd >= arr.length) {
lEnd = arr.length - 1;
}
tasks.add(pool.submit(new MergeSortRunnable(rStart, rEnd, lEnd)));
}
// wait for all threads to finish
for (Future f : tasks) {
try {
f.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
} } } private class InsertionSortRunnable implements Runnable {
private int start;
private int end; public InsertionSortRunnable(int start, int end) {
this.start = start;
this.end = end;
} @Override
public void run() {
Arrays.sort(arr, start, end);
} } private class MergeSortRunnable implements Runnable { private int start;
private int end;
private int mid; public MergeSortRunnable(int start, int mid, int end) {
this.start = start;
this.end = end;
this.mid = mid;
} @Override
public void run() {
if (start < end && mid <= end) {
merge(arr, start, mid, end);
} } } }

多线程归并排序(摘自githhub)的更多相关文章

  1. 多线程归并排序的实现 java

    多线程是非常适合归并排序的,因为归并排序是分治法,所以分割后可以独立运行,最后将结果归并起来就行了.如何写一个多线程程序呢?今天无聊,总结一下啊. 首先写个普通的归并排序,以后的多线程就调用这个排序. ...

  2. 归并排序 求逆序数 链表的归并排序 多线程归并排序 java

    import java.util.Scanner; public class Main { private static int count=0; public static void mergeso ...

  3. .net多线程归并排序

    一.概述 在了解排序算法的同时,想到用多线程排序减少排序的时间,所以写了一个简单的示例,加深印象.下面是具体代码 二.内容 环境:vs2017,.net  core 2.2 控制台程序. 运行时使用r ...

  4. java并发多线程(摘自网络)

    1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...

  5. pthread 多线程基础

    本文主要介绍如何通过 pthread 库进行多线程编程,并通过以下例子进行说明. 基于莱布尼兹级数计算 \(\pi\) . 多线程归并排序 参考文章: [1] https://computing.ll ...

  6. 秋招落幕,对自己的总结by2018-10-20

    在今天阿里沟通offer完毕,正式三方也确定了,一切如梦,想想1月的自己还担心未来的自己会花落谁家,到10月的今天,一切尘埃落地.一直不怎么喜欢总结自己的历程,今天无聊的我也总结一波吧. 准确的说没有 ...

  7. java归并排序,单线程vs多线程

    一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...

  8. 多线程外排序解决大数据排序问题2(最小堆并行k路归并)

    转自:AIfred 事实证明外排序的效率主要依赖于磁盘,归并阶段采用K路归并可以显著减少IO量,最小堆并行k路归并,效率倍增. 二路归并的思路会导致非常多冗余的磁盘访问,两组两组合并确定的是当前的相对 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

随机推荐

  1. 关于NRW算法(Quorum算法)

    在分布式系统中,冗余数据是保证可靠性的手段,因此冗余数据的一致性维护就非常重要.一般而言,一个写操作必须要对所有的冗余数据都更新完成了,才能称为成功结束.比如一份数据在5台设备上有冗余,因为不知道读数 ...

  2. CGAL 介绍

    CGAL组织 内核 数值健壮 基础库 扩展性 2.4 命名约定 Naming In order to make it easier to remember what kind of entity a ...

  3. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割

    1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...

  4. extern "C"的作用

    一.概述 在C语言的头文件中,经常可以看到如下的代码,那这个是什么作用呢? #ifdef __cplusplus extern "C" { #endif /*...*/ #ifde ...

  5. UIViewCotroller 的生命周期函数

    Viewcontroller 的所有生命周期函数 重写时 一定要先写 父类 方法 就是(super  +生命周期函数) LoadView ViewDidLoad ViewDidUnload: 在iOS ...

  6. <四> jQuery 事件

    $(document).ready(function) 将函数绑定到文档的就绪事件(当文档完成加载时) $(selector).click(function) 触发或将函数绑定到被选元素的点击事件 $ ...

  7. Hyper-V中安装CentOS分辨率修改

    Hyper-V还是极好用的,不过对linux的支持优点问题, 比如默认情况,linux分辨率被锁定了,这里有一个比较简单的方法修改,针对CentOS grubby --update-kernel=AL ...

  8. Tomacat服务器的安装和配置

    一, Tomcat服务器的下载地址(Apache Tomcat的官网):  http://tomcat.apache.org/download-70.cgi 这里为了稳定性安装的版本为7.0. 截止目 ...

  9. WAF 与 RASP 的安装使用大比拼!

    什么是WAF和RASP? WAF全称是Web application firewall,即 Web 应用防火墙.RASP 全称是 Runtime Application Self-protect,即应 ...

  10. UL LI 布局 TAB 切换条

    web页面实现tab的功能有几种实现方式,下面是使用UL LI DIV方式实现的tab. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...