• 奇偶排序


    在《java高并发程序设计》一书中看到关于一种并行算法排序方法:奇偶排序。结合书上与网上的各项资料,在这里按自己的理解做下梳理。

    介绍

    冒泡排序:是串行算法,在每次迭代过程中,对于每个元素可能与前面元素交换,也可能和后面的元素交换,数据的相关性比较强很难直接改成并行算法。

    奇偶排序:或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算。这是与冒泡排序特点类似的一种比较排序

    该算法中,排序过程分两个阶段,奇交换和偶交换,两种交换都是成对出现。对于奇交换,它总是比较奇数索引以及其相邻的后续元素。对偶交换,总是比较偶数索引和其相邻的后续元素。思路是在数组中重复两趟扫描。第一趟扫描选择所有的数据项对,a[j]和a[j+1],j是奇数(j=1, 3, 5……)。如果它们的关键字的值次序颠倒,就交换它们。第二趟扫描对所有的偶数数据项进行同样的操作(j=2, 4,6……)。重复进行这样两趟的排序直到数组全部有序。

    简单来说就是:奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序。

    动态图如下:

    示例:

    待排数组[6 2 4 1 5 9]   //目标按从小到大排序

    第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比

    [6 2 4 1 5 9]

    交换后变成

    [2 6 1 4 5 9]

    第二次比较偶数列,即6和1比,5和5比

    [2 6 1 4 5 9]

    交换后变成

    [2 1 6 4 5 9]

    第三次又是奇数列,选择的是2,6,5分别与它们的邻居列比较

    [2 1 6 4 5 9]

    交换后

    [1 2 4 6 5 9]

    第四次偶数列

    [1 2 4 6 5 9]

    一次交换

    [1 2 4 5 6 9]

    疑问:怎么就变成并行算法了?

    从示例中,可看出整个比较交换分为独立的奇阶段或偶阶段。在每个阶段内,所有的比较和交换是没有数据相关性。因此,每一次比较和交换都可独立执行,也就可以并行化了。比如,第一次奇阶段排序中,100个元素可以分为4个CPU执行,第一个排序1-25,第二个排序26-50,第三个排序51-75,第四个排序76-100。

    代码实现:

    奇偶排序的串行实现

     exchFlag记录当前迭代是否发生了数据交换,start变量表示是奇交换还是偶交换。

    初始时:start为0,表示偶交换,每次迭代结束后,切花start的状态。如果上一次比较交换发生了数据交换,或当前正在进行的是奇交换,循环就不会停止,直到程序不会在发生交换,并且当前进行的是偶交换为止(表示奇偶交换已经成对出现)。

    改造成并行模式,使用countDownLatch。

     

    代码第9行,定义了奇偶排序的任务类,该任务的主要工作是进行数据比较和必要的交换(18-23行)。

    并行排序的主体是pOddEvenSort()方法,使用CountDownLatch记录线程数量,对于每一次迭代,使用单独的线程对每一次元素比较和交换进行操作。在下一次迭代开始前,必须等待上一次迭代所有线程的完成。

    其他代码实现:

    http://blog.csdn.net/benjamin_whx/article/details/42456755

    https://github.com/William-Hai/ArraySortAlgorithm/blob/master/src/org/algorithm/array/sort/impl/OddEvenSort.java

    参考资料:

    1、经典排序算法 - 奇偶排序Odd-even sort

    2、

  • 相关阅读:
    iOS设置app应用程序文件共享
    UIButton 一个控件 实现 左图标右文本的效果
    centos7 修改selinux 开机导致 faild to load SELinux policy freezing 错误
    centos7 使用 omnibus包安装方式,安装 gitlab7.4
    iOS app 企业内部发布及HTTPS服务器配置
    centos7 安装mariaDB 以及 phpmyadmin的安装
    centos7 最小化安装 无 ifconfig,netstat 的安装
    windows 下使用 Filezilla server 搭建 ftp 服务器
    PostgreSQL 登录时在命令行中输入密码
    Docker Error response from daemon: driver failed programming external connectivity on endpoint webserver
  • 原文地址:https://www.cnblogs.com/kongzhongqijing/p/6687699.html
Copyright © 2020-2023  润新知