当前位置: 首页 > news >正文

奇偶排序

在《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、

相关文章:

  • Oracle分组取第一条数据
  • 听说你叫Java(二)–Servlet请求
  • BZOJ 3172 Tjoi2013 单词 后缀数组
  • C#基础_MD5
  • Protobuf3 语法指南
  • Oracle数据库服务器IO高的分析方案和案例探讨
  • yii2清空模态框表单的数据,每次点击开始之前让数据清空
  • 依赖类型语言Idris发布1.0版本
  • asp.net请求处理过程
  • 查看符号
  • 教主泡嫦娥[有趣的dp状态设计]
  • Android popupwindow 演示样例程序一
  • 我的朗科运维第七课
  • 正则表达式 re.findall 用法
  • Python中文件操作
  • 2019.2.20 c++ 知识梳理
  • Android 控件背景颜色处理
  • go语言学习初探(一)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • LeetCode29.两数相除 JavaScript
  • Python连接Oracle
  • SpringBoot几种定时任务的实现方式
  • Vue2 SSR 的优化之旅
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Wamp集成环境 添加PHP的新版本
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 聊聊sentinel的DegradeSlot
  • 双管齐下,VMware的容器新战略
  • # Panda3d 碰撞检测系统介绍
  • #android不同版本废弃api,新api。
  • $.ajax()参数及用法
  • $.proxy和$.extend
  • (2)STL算法之元素计数
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一一四)第九章编程练习
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转载)利用webkit抓取动态网页和链接
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .describe() python_Python-Win32com-Excel
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net 路由处理厉害了
  • .php文件都打不开,打不开php文件怎么办
  • /proc/vmstat 详解
  • @Autowired多个相同类型bean装配问题
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [autojs]逍遥模拟器和vscode对接