合并排序-多线程算法

来源:互联网 发布:java开发三年待遇薪资 编辑:程序博客网 时间:2024/06/06 20:20
package com.data.struct;import java.util.concurrent.CountDownLatch;public class CopyOfMultiThreadMergeSort2 {private static void mergeSort(int [] source,int left,int right,CountDownLatch cdl){if(left==right){cdl.countDown();cdl.countDown();return ;}else{int middle=(left+right)/2;MergeSortThread t1=new MergeSortThread(source,left,middle,cdl);t1.start();MergeSortThread t2=new MergeSortThread(source,middle+1,right,cdl);t2.start();try {cdl.await();} catch (InterruptedException e) {}int[]tmp=new int[right-left+1];int l=0;int lindex=left;int rindex=middle+1;for(;lindex<=middle;){if(rindex>right){break;}if(source[lindex]<source[rindex]){tmp[l++]=source[lindex];lindex++;}else{tmp[l++]=source[rindex];rindex++;}}if(lindex==middle+1&&rindex<=right){for(;rindex<=right;rindex++){tmp[l++]=source[rindex];}}if(rindex>right&&lindex<=middle){for(;lindex<=middle;lindex++){tmp[l++]=source[lindex];}}l=0;for(int x=left;x<=right;x++){source[x]=tmp[l++];}for(int i=0;i<source.length;i++){System.out.print(source[i]+" ");}System.out.println();}}private static class MergeSortThread extends Thread{private int[]A;private int p;private int r;private CountDownLatch cdl;public MergeSortThread(int[]A,int p,int r,CountDownLatch cdl){this.A=A;this.p=p;this.r=r;this.cdl=cdl;}@Overridepublic void run() {CountDownLatch c=new CountDownLatch(2);mergeSort(A,p,r,c);try {c.await();} catch (InterruptedException e) {e.printStackTrace();}this.cdl.countDown();}}public static void main(String[] args) {int[] data=new int[]{4,5,2,9,1,0,7};for(int i=0;i<data.length;i++){System.out.print(data[i]+" ");}System.out.println();CountDownLatch cd=new CountDownLatch(2);mergeSort(data,0,data.length-1,cd);;try {cd.await();} catch (InterruptedException e) {e.printStackTrace();}for(int i=0;i<data.length;i++){System.out.print(data[i]+" ");}System.out.println();}}

0 0
原创粉丝点击