本文共 3139 字,大约阅读时间需要 10 分钟。
很多计算机专业的同学们相信你们学习算法的第一个排序就是冒泡吧,冒泡属于串行排序。所以本节我们想想并行的一些列方法。让你脑洞打开
package pattern.sort;/** * Created by ycy on 16/1/16. * 冒泡 * 大得数字下沉,小的数字上浮 * 详解:冒泡真谛,大的数据走后面,小的数据走前面 * 第一次讲解;哎 * 第一个循环是表示还有多少数据需要处理 * 第二个循环是把最大的数据往最后移动 * */public class bubble { public static void main(String[] args) { int[] arr={1,3336,7,88,454,7556}; for (int i = arr.length-1; i>0 ; i--) { //1'每一次需要排序的数量,因为2'里面每次都一个数据移动到最大, // 所以每次是递减的次数,2'执行一次,下次排序的数据就少一个了哦(因为最大的已经到最后了) for (int j = 0; j arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } for (int arrone:arr ) { System.out.println(arrone); } }}
public static void oddEnventSort(int arr[]){ int exchflag=1,start=0; while (exchflag==1||start==1){ //表示是否发生了交换 exchflag=0; for (int i = start; iarr[i+1]) { int temp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=temp; exchflag=1; } } //用来表示奇偶性,初始时候为0,表示偶数交换;1表示奇数交换 if (start==0){ start=1; }else { start=0; } } }
/修改为并行奇偶性/// static int exchangeFlag=1; static ExecutorService pool= Executors.newCachedThreadPool(); static int[] array={1,4,2,6,35,3}; static synchronized void setExchangeFlag(int v){ exchangeFlag=v; } static synchronized int getExchangeFlag(){ return exchangeFlag; } public static class OddEventSortTask implements Runnable{ int i; CountDownLatch latch; public OddEventSortTask(int i,CountDownLatch latch){ this.i=i; this.latch=latch; } public void run() { if (array[i]>array[i+1]){ int temp=array[i]; array[i]=array[i+1]; array[i+1]=temp; setExchangeFlag(1); } latch.countDown(); } } public static void pOddEventSort(int[] arr) throws InterruptedException { int start=0; while (getExchangeFlag()==1||start==1){ setExchangeFlag(0); //偶数的数组长度,当start=1时候,只有len/2-1 个线程 CountDownLatch latch=new CountDownLatch(arr.length/2-(arr.length%2==0?start:0)); for (int i = start; i < arr.length; i+=2) { pool.submit(new OddEventSortTask(i,latch)); } //等待所有县城结束 latch.await(); if (start==0){ start=1; }else { start=0; } } } public static void main(String[] args) throws InterruptedException { pOddEventSort(array); for (int ar:array ) { System.out.println(ar); } }排序的主体是pOddEventSort()方法,它使用ContLatch记录线程数量,每一次迭代,适用单独的线程对每一次元素比较和交换。一下次迭代钱,必须上一次迭代所有线程完毕。
转载地址:http://yijoo.baihongyu.com/