多线程归并排序的实现 java

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

首先写个普通的归并排序,以后的多线程就调用这个排序。

1.这段代码很简单,就是一个基本的归并排序,知道这个类中的sort实现归并排序就OK.package 归并排序;

import java.util.Arrays;
public class SequentialMergeSort  {

    public void sort(int[] 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;
        }

        int start = 0;
        int end = arr.length - 1;
        mergeSort(arr, start, end);
    }

    // helper method for merge sort
    protected void mergeSort(int[] arr, int start, int end) {
        if (start < end) {
            int mid = (start + end) / 2;
            mergeSort(arr, start, mid);
            mergeSort(arr, mid + 1, end);
            merge(arr, start, mid, end);
        }
    }

    protected void merge(int[] arr, int start, int mid, int end) {

        // copy the left half into left array
        int[] leftArray = Arrays.copyOfRange(arr, start, mid + 1);
        // copy right half into right array
        int[] rightArray = Arrays.copyOfRange(arr, mid + 1, end + 1);
        int leftArrayPtr = 0, rightArrayPtr = 0, inputArrayPtr = start;
        // merge until we reach end of either one of the arrays
        for (; leftArrayPtr < leftArray.length && rightArrayPtr < rightArray.length; inputArrayPtr++) {

            if (leftArray[leftArrayPtr] <= rightArray[rightArrayPtr]) {
                arr[inputArrayPtr] = leftArray[leftArrayPtr];
                leftArrayPtr++;
            } else {
                arr[inputArrayPtr] = rightArray[rightArrayPtr];
                rightArrayPtr++;
            }
        }

        // finish up if there are any remaining elements
        for (; leftArrayPtr < leftArray.length; leftArrayPtr++, inputArrayPtr++) {
            arr[inputArrayPtr] = leftArray[leftArrayPtr];
        }
        for (; rightArrayPtr < rightArray.length; rightArrayPtr++, inputArrayPtr++) {
            arr[inputArrayPtr] = rightArray[rightArrayPtr];
        }
    }

}

2.多线程咋实现呢?

比如现在有

时间: 2025-01-03 23:45:16

多线程归并排序的实现 java的相关文章

多线程归并排序(摘自githhub)

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.Futu

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

参看:数据结构与算法分析-c语言描述 public class Main { public static void main(String[] args) { String[] a = { "a", "d", "e", "f", "m" }; String[] b = { "a", "h", "g", "l", "z&

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

import java.util.Scanner; public class Main { private static int count=0; public static void mergesort(int a[],int low,int high) { if(low<high) { int mid=(low+high)>>1; mergesort(a,low,mid); mergesort(a,mid+1,high); merge(a,low,mid,high); } } pri

多线程--毕向东java基础教程视频学习笔记

多线程运行的安全问题 例子:售票系统 1 class Ticket implements Runnable 2 { 3 //定义静态变量ticket 4 private static int ticket=100; 5 public void run() 6 { 7 while(true) 8 { 9 //判断票编号是否大于0 10 if(ticket>0) 11 { 12 try 13 { 14 Thread.sleep(10); 15 } 16 catch (InterruptedExcep

编程思想之多线程与多进程(2)——Java中的多线程

原文:http://blog.csdn.net/luoweifu/article/details/46673975 作者:luoweifu 转载请标名出处 <编程思想之多线程与多进程(1)--以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下Java中多线程程序的开发 单线程 任何程序至少有一个线程,即使你没有主动地创建线程,程序从一开始执行就有一个默认的线程,被称为主线程,只有一个线程的程序称为单线程程序.如下面

java 多线程(0) Java线程

线程 线程是系统调度的基本单元,每当创建一个进程时,会有许多的线程,也叫轻量级进程,在一个进程中拥有多个线程,各自都有自己的计数器,堆和局部变量属性,并且能够分享内存变量. 为什么要使用多线程  1.更多的处理器核心 2.更快的响应时间 3.更好的编程模型 优先级 线程优先级决定了线程需要多或少分配一些处理器资源的线程属性,通过priority来控制优先级,范围从1-10,在线程构建SetPriority(int)方法来修改优先级,默认为5. 线程的运行状态 状态名称 说明 NEW 初始状态,线

Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解

   我们知道在多线程编程中,我们很大的一部分内容是为了解决线程间的资源同步问题和线程间共同协作解决问题.线程间的同步,通俗我们理解为僧多粥少,在粥有限情况下,我们怎么去防止大家有秩序的喝到粥,不至于哄抢都没得喝.线程讲协作,我们可以理解为我们在医院看病的时候,我们要先挂号,才能看病.现在医院有很多病人排队,怎么协调病人都有秩序的先挂号,后看病.本篇文章的重点不在此,也不是在此一下子能分析完,我们先从Java JVM的角度来理解多线程的一些方面. 我们知道多线程间的数据同步,我们是通过加锁的操作

多线程编程学习一(Java多线程的基础)

一.进程和线程的概念 进程:一次程序的执行称为一个进程,每个 进程有独立的代码和数据空间,进程间切换的开销比较大,一个进程包含1—n个线程.进程是资源分享的最小单位. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小,线程是CPU调度的最小单位. 多进程:指操作系统能同时运行多个任务(程序). 多线程:指同一个程序中有多个顺序流在执行,线程是进程内部单一控制序列流. 二.多线程的优势 单线程的特点就是排队执行,也就是同步.而多线程能最大限度的利用CP

Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 继承thread类 1 package com.threadtest; 2 clas