JAVA并发处理经验(四)并行模式与算法5:并行排序模式-奇偶性排序

简介: 一、前言很多计算机专业的同学们相信你们学习算法的第一个排序就是冒泡吧,冒泡属于串行排序。所以本节我们想想并行的一些列方法。

一、前言

很多计算机专业的同学们相信你们学习算法的第一个排序就是冒泡吧,冒泡属于串行排序。所以本节我们想想并行的一些列方法。让你脑洞打开

二、并行排序

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记录线程数量,每一次迭代,适用单独的线程对每一次元素比较和交换。一下次迭代钱,必须上一次迭代所有线程完毕。




目录
相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
73 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
109 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
24 1
|
1月前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
1月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
106 0
|
2月前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
65 11
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
23 0
|
2月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
3月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
66 2
|
3月前
|
消息中间件 Java
【实战揭秘】如何运用Java发布-订阅模式,打造高效响应式天气预报App?
【8月更文挑战第30天】发布-订阅模式是一种消息通信模型,发送者将消息发布到公共队列,接收者自行订阅并处理。此模式降低了对象间的耦合度,使系统更灵活、可扩展。例如,在天气预报应用中,`WeatherEventPublisher` 类作为发布者收集天气数据并通知订阅者(如 `TemperatureDisplay` 和 `HumidityDisplay`),实现组件间的解耦和动态更新。这种方式适用于事件驱动的应用,提高了系统的扩展性和可维护性。
71 2
下一篇
无影云桌面