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




目录
相关文章
|
30天前
|
存储 Java
Java 编程实例:相加数字、计算单词数、字符串反转、元素求和、矩形面积及奇偶判断
Java中相加两个数字可通过简单赋值实现,如`int sum = x + y;`。若要用户输入数字相加,可使用`Scanner`类读取。计算单词数,可使用`split()`方法或`StringTokenizer`类。反转字符串,可用`for`循环或`StringBuilder`的`reverse()`方法。计算数组元素总和,可遍历数组累加。矩形面积通过长度乘以宽度得出。判断奇偶性,利用模2运算或位运算检查最低位。更多内容,可关注微信公众号`Let us Coding`。
49 0
|
22天前
|
存储 算法 Java
Java数据结构与算法-java数据结构与算法(二)
Java数据结构与算法-java数据结构与算法
63 1
|
6天前
|
存储 Java
模式匹配魔法:Java 21中switch语句的巨大进化
模式匹配魔法:Java 21中switch语句的巨大进化
9 0
|
16天前
|
搜索推荐 Java
Java排序算法
Java排序算法
18 0
|
16天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
22 4
|
19天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
32 0
|
22天前
|
XML 存储 算法
Java数据结构与算法-java数据结构与算法(五)
Java数据结构与算法-java数据结构与算法
47 0
|
29天前
|
传感器 人工智能 数据可视化
Java智慧工地监管一体化云平台APP源码 SaaS模式
高支模监测:高支模立杆及倾斜角度,高支模立杆的荷载,架体的水平位移以及模板沉降情况,当检测数据超过预警值时,实时报警。
29 2
|
30天前
|
算法 搜索推荐 Java
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
13 1
|
1月前
|
并行计算 算法 搜索推荐