在《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记录线程数量,对于每一次迭代,使用单独的线程对每一次元素比较和交换进行操作。在下一次迭代开始前,必须等待上一次迭代所有线程的完成。

其他代码实现:

参考资料:

2、

java奇偶排序算法_奇偶排序相关推荐

  1. java实现apriori算法_各种排序算法的分析及java实现(一)

    阅读本文约需要7分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下用Navicat for Mysql导入.sql文件的 ...

  2. java常见的排序算法_常见排序算法及Java实现

    先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...

  3. python常见的排序算法_常见排序算法之python实现

    1. 冒泡排序 时间复杂度为O(n^2), 稳定的排序算法 思路:一开始比较的区间是[0,n-1],依次比较相邻两数,哪个数大哪个数就放在后面,这样一次遍历数组后,最大的数会在数组的最后一个位置,然后 ...

  4. 排序算法_桶排序(箱排序)

    一.算法描述 假设有一组长度为N的待排关键字序列K[1....n]. 首先将这个序列划分成M个的子区间(桶). 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) , ...

  5. 起泡排序算法_气泡排序算法

    起泡排序算法 When working with large databases, it is necessary to add the functionality to search for val ...

  6. c语言合并排序算法_合并排序算法

    c语言合并排序算法 Merge Sort follows the rule of Divide and Conquer to sort a given set of numbers/elements, ...

  7. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  8. Java常见排序算法之Shell排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  9. 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序

    vs code ppt c++/java 目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的 ...

最新文章

  1. 完成一个MVC+Nhibernate+Jquery-EasyUI信息发布系统
  2. [云炬创业基础笔记]第一章创业环境测试6
  3. window下rails4.1 发生TZInfo::DataSourceNotFound 错误
  4. 2016.09.03【初中部 NOIP提高组 】模拟赛A总结
  5. 决策树系列(二)——剪枝
  6. 下载应用 ipa 包,不妨试试这款开源工具
  7. Nutch第一次搭建部署总结
  8. 微信小程序——微信授权获取手机号弹窗(官方自带)
  9. 最近学到一个新词“汽车含硅量”
  10. 高性能服务器架构 第四篇
  11. opencv imread函数
  12. OpenLayers 3 之 添加地图网格
  13. 毕业设计 远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网
  14. 证明版~(半)正定\负定的充要条件(用各种矩阵表示)
  15. 贝恩解密NFT区块链游戏和收藏品市场
  16. android逆向01:修改apk的资源文件,smali插桩
  17. TX 和RX 代表什么
  18. 【数学相关、逻辑推理】
  19. php mysql iconv_freeBSD 安装php扩展:iconv
  20. 翼次元空间资讯:区块链互联网酒业“心直酒快”有动作

热门文章

  1. vue报错: ERROR ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode.
  2. One PUNCH Man——支持向量机
  3. 【第四篇】CSS选择器之伪类选择器
  4. c++求若干个集合的笛卡尔积
  5. Docker镜像载入打开更改及保存本地
  6. 2021-06-26 JSON解析
  7. symbian备忘录
  8. android 免费游戏推荐,25款免费Android游戏推荐【3】
  9. php字数超出省略号,thinkcmf 标题字数超出显示省略号 | 速光网络博客
  10. 怎么理解js的原型链继承?