java奇偶排序算法_奇偶排序
在《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奇偶排序算法_奇偶排序相关推荐
- java实现apriori算法_各种排序算法的分析及java实现(一)
阅读本文约需要7分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下用Navicat for Mysql导入.sql文件的 ...
- java常见的排序算法_常见排序算法及Java实现
先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...
- python常见的排序算法_常见排序算法之python实现
1. 冒泡排序 时间复杂度为O(n^2), 稳定的排序算法 思路:一开始比较的区间是[0,n-1],依次比较相邻两数,哪个数大哪个数就放在后面,这样一次遍历数组后,最大的数会在数组的最后一个位置,然后 ...
- 排序算法_桶排序(箱排序)
一.算法描述 假设有一组长度为N的待排关键字序列K[1....n]. 首先将这个序列划分成M个的子区间(桶). 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) , ...
- 起泡排序算法_气泡排序算法
起泡排序算法 When working with large databases, it is necessary to add the functionality to search for val ...
- c语言合并排序算法_合并排序算法
c语言合并排序算法 Merge Sort follows the rule of Divide and Conquer to sort a given set of numbers/elements, ...
- java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析
0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...
- Java常见排序算法之Shell排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序
vs code ppt c++/java 目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的 ...
最新文章
- 完成一个MVC+Nhibernate+Jquery-EasyUI信息发布系统
- [云炬创业基础笔记]第一章创业环境测试6
- window下rails4.1 发生TZInfo::DataSourceNotFound 错误
- 2016.09.03【初中部 NOIP提高组 】模拟赛A总结
- 决策树系列(二)——剪枝
- 下载应用 ipa 包,不妨试试这款开源工具
- Nutch第一次搭建部署总结
- 微信小程序——微信授权获取手机号弹窗(官方自带)
- 最近学到一个新词“汽车含硅量”
- 高性能服务器架构 第四篇
- opencv imread函数
- OpenLayers 3 之 添加地图网格
- 毕业设计 远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网
- 证明版~(半)正定\负定的充要条件(用各种矩阵表示)
- 贝恩解密NFT区块链游戏和收藏品市场
- android逆向01:修改apk的资源文件,smali插桩
- TX 和RX 代表什么
- 【数学相关、逻辑推理】
- php mysql iconv_freeBSD 安装php扩展:iconv
- 翼次元空间资讯:区块链互联网酒业“心直酒快”有动作
热门文章
- vue报错: ERROR ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode.
- One PUNCH Man——支持向量机
- 【第四篇】CSS选择器之伪类选择器
- c++求若干个集合的笛卡尔积
- Docker镜像载入打开更改及保存本地
- 2021-06-26 JSON解析
- symbian备忘录
- android 免费游戏推荐,25款免费Android游戏推荐【3】
- php字数超出省略号,thinkcmf 标题字数超出显示省略号 | 速光网络博客
- 怎么理解js的原型链继承?