JAVA并发处理经验(四)并行模式与算法5:并行排序模式-奇偶性排序
来源:互联网 发布:2011年十大网络流行语 编辑:程序博客网 时间:2024/05/29 04:08
一、前言
很多计算机专业的同学们相信你们学习算法的第一个排序就是冒泡吧,冒泡属于串行排序。所以本节我们想想并行的一些列方法。让你脑洞打开
二、并行排序
2.1 冒泡排序
里面的解释已经很清楚;以前上课的时候,看懂意思了,没看懂代码。现在大家还是先基础复习一下l
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 <i ; j++) { //2'每一次都是修改的j与j+1的值,下次判断j+1 一直到最后一个length位置; // -----全部走完就肯定有一个数据走到最后 if (arr[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); } }}
2.2 奇偶性排序
奇偶性:排序关键,奇数跟后面一个数据交换。接着进入偶数,也跟后面一个数据交换;就这样把数据所有的数据交互完毕;
public static void oddEnventSort(int arr[]){ int exchflag=1,start=0; while (exchflag==1||start==1){ //表示是否发生了交换 exchflag=0; for (int i = start; i <arr.length ; i+=2) { if (arr[i] > arr[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; } } }
2.2 奇偶性排序的并行改造
/////////////////////////修改为并行奇偶性/////////////////////////// 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记录线程数量,每一次迭代,适用单独的线程对每一次元素比较和交换。一下次迭代钱,必须上一次迭代所有线程完毕。
0 0
- JAVA并发处理经验(四)并行模式与算法5:并行排序模式-奇偶性排序
- JAVA并发处理经验(四)并行模式与算法5:并行排序模式-希尔排序
- JAVA并发处理经验(四)并行模式与算法3:并行流水线模式
- JAVA并发处理经验(四)并行模式与算法4:并行搜索模式
- JAVA并发处理经验(四)并行模式与算法1:生产者消费与单例模式
- JAVA并发处理经验(四)并行模式与算法2:Future模式
- JAVA并发处理经验(四)并行模式与算法6:socket的服务端多线程
- JAVA并发处理经验(四)并行模式与算法6:NIO网络编程
- JAVA并发处理经验(四)并行模式与算法7:AIO网络编程
- 《Java高并发程序设计》总结--5. 并行模式与算法
- 并行模式与算法
- 《Java高并发程序设计》学习 --5.9 并行模式之并行算法:矩阵乘法
- Java并行模式:并行流水线
- java高并发-并行模式(上).md
- java高并发-并行模式(下).md
- 并行排序算法
- 第五章 并行模式与算法
- java并行程序设计模式
- 计算匹配字符串的个数
- Protobuf改subset模式缺少dll问题
- 老老实实做站 首页自然回归第一
- strong与weak的区别
- 多控制器管理:UINavigationController与UITabBarController
- JAVA并发处理经验(四)并行模式与算法5:并行排序模式-奇偶性排序
- 线程间的通信
- linux 下使用sim900打电话发短信
- 如何总结和整理学术文献
- LCA 模板
- POJ1860(Currency Exchange)(Bellman-Ford)
- 283. Move Zeroes
- GalleryFinal——eclipse版
- 详解AB压力测试