当前位置:
文档之家› 并行计算中快速排序算法的改进
并行计算中快速排序算法的改进
2. 快速排序简介
快速排序( Quicksort) 3 是对冒泡排序的一种改进。由 C. A. R. Hoare 在 1962 年 提出。它的基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的 所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速 排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序算法是利用分治技术的典型例子。分治策略分为三步。首先将问题分成若干大 小基本相等的子问题;独立地解决这些子问题;最后将子问题归并成原问题的解。因此方法 的有效性取决于对初始问题划分的过程和最后一步归并解的过程。 假设待排序的 n 个元素存储在数组 A[0,n-1]中。快速排序算法的高级描述如下: (1)从数组 A[0,n-1]中选取枢轴元素。 (2) 重排数组 A 中元素,并将其划分成左右两部分。使得数组中所有比枢轴元素小的元 素在左部分中,比它大的元素在右部分中。 (3) 对左、右部分进行递归排序。 如果先不看实现的细节和算法的正确性证明, 不难看出算法使用了分治策略。 在这种情 况下,第一、二步相应于划分步,第三步求解归约的子问题,实现对整个数组的排序,从而 无需归并步骤。在快速排序算法的描述中,忽视了两个关键的问题: (1)选择枢轴元素的方法; (2) 如枢轴元素被选择后,使用的划分方法。
3
的处理器编号为 p21,p22,p23 ... p2p,第 kk 段处理器编号为 pk1,pk2,pk3….pkp, 每一段的数据保存在与段号与处理器编号相同的处理器上。比如,第 k1 段数据就保存 在第 p11 个处理器, 第 k2 段数据保存在第 p22 个处理器上, 第 kk 段数据保存在第 pkk 个处理器上。这样就有 k 个处理器保存了 k 段数据,用第一个处理器和第 2 个处理器 进行比较排序,第三个和第四个进行比较,依次类推,在用第 1 和第 2 个处理器比较 得到的有序序列和第 3 和第 4 个处理器比较得到的有序序列进行比较,最后得到一个 具有个 n 数据的有序序列。当 k 刚好是 2 的倍数时如图 1 所示。当 k 不是 2 的倍数 时如图 2 所示。 End
2
(2.1) LCfi = i (2.2) if i = LCfi then exit else if = LCfi endif else (2.3) RCfi = i (2.4) if i = RCfi then exit else fi = RCfi endif endif end repeat End
5. 归并排序与快排序相结合的改进算法
该算法的基本思想是:把 n 个数据分为 k 段,即 k= n /p( p 为处理器的个数) ,每一段 有 p 个元素,其次在用快排序算法的思想把每一组数据进行排序,最后在用归并排序算法 把 P 组数据进行归并排序,这样就可以解决当 n 远远大于 p 时,快排序并行算法要求待排 序数据个数与处理器台数相同但是在实际应用中不可行问题[8]。 输入 : 长度为 n 的无序序列,有 p 个处理器,把 n 分为 n /p = k 段,每段有 k( p = n /k) 个数据,每段数据有 p( p = n /k) 台处理器,每台处理器有一个数据。 输出: 长度为 n 的有序序列。 Begin ( 1) 均匀划分: 并行处理器有 p 个处理器,n 个元素划分成 k( n /p = k) 段,每一段有 p( p = n /k) 个元素,即一台处理器上有一个元素。 ( 2) 局部排序: 每一段上的 p 个处理器对 p 个元素进行快速排序, 得到 k 段有序序列, 用 k1,k2,k3…kk 表示。第 k1 段处理器的编号为 p11,p12,p13 ….p1p;第 k2 段
1. 引言
排序是计算机科学中最重要的研究问题之一。由于它的应用广泛和固有的理论上的重要 性,2000 年它被列为对科学和工程计算的研究与实践影响最大的 10 大问题之一[1]。因此对 于排序的研究既有理论上的重要意义,又有实际应用价值。它在计算机图形、计算机辅助设 计、机器人、模式识别及统计学等领域具有广泛应用[2]。基本的排序问题是重排一个给定的 数据项集,使它按递增(或递减)排列。数据项可以是具有线性顺序的任意对象。例如,在 典型商业数据处理应用中数据项是记录, 每一个记录都包含有一个称为关键字的特殊标识符 域,并且记录是按关键字进行排序。排序能够大大简化查找或更新一个记录的过程。到目前 为止, 尽管研究人员已经设计了多种排序算法。 但快速排序仍然是实际应用中最常用的一种 排序算法。 对它复杂度的分析方法和数据结构的研究是研究许多应用问题的基础。 快速排序 中使用的分治策略是设计有效计算几何和组合问题算法的典型设计方法。 本文将探讨并行计 算中快速排序的改进。
Hale Waihona Puke 4.3 PRAM-CRCW 上的快速排序二叉树中序遍历算法
算法一:PRAM-CRCW 上的快速排序二叉树中序遍历算法 输入:A[A1,… , An]和 n 个处理器,并且 A[j]保存在 Pi 的 LM 中 输出:二叉排序树 root,LC[1…n],RC[1…n]在 PM 中 Begin (3) for each Pi par-do (1.1) root = i (1.2) fi = root (1.2) LCi = RCi = n + 1 endfor (4) repeat for each Pi <> root par-do if (Ai <Afi) ∪ (Ai = Afi ∩ i < fi) then (2.1) LCfi = i (2.2) if i = LCfi then exit else if = LCfi endif else (2.3) RCfi = i (2.4) if i = RCfi then exit else fi = RCfi endif endif end repeat End 在算法 1 中,可在 O( 1) 时间内构造一级树,而树的高度为 O( logn) ,所以算法 1 的 时间复杂度为 O( logn) 。当二叉树构造好以后,采用中序遍历( 算法 2) 就可以得到一个有 序序列,中序遍历的时间复杂度为 O( logn),所以并行排序算法的时间复杂度 O( 2logn) , 要比串行的快速排序的时间复杂度( O( nlogn) ) 小很多。但是,在并行算法里要求处理器的 个数与序列中数据的个数相同, 在实际应用中不可行, 所以本文提出利用数据划分方法先把 n( 待排序的数据个数) 个数据进行分段,把 n 个数据分为 k 段,即 k= n /p( p 为处理器的 个数) ,每一段有 p 个元素,其次在用快排序算法的思想把每一组数据进行排序,最后在 用归并排序算法把 P 组数据进行归并排序,这样就可以解决当 n 远远大于 p 时,快排序并 行算法要求待排序数据个数与处理器台数相同但是在实际应用中不可行问题。
4.1 PRAM-CRCW 上快速排序算法
执行快排序可以看成是构造一棵二叉树,其中主元是根,小于等于主元的元素处于左子 树,大于主元的元素处于右子树。算法首先从选第一个主元开始,它划分原序列为两个自序 列;然后相继子序列中主元的选取则可并行执行。当这样的二叉树造好后,采用中序遍历的 方法就可得到一个有序序列[7]。 令待排序的序列为( A1, … , An) ,处理器 Pi 保存元素 Ai,LC[1: n]和 RC[1: n] 分别记录给定主元的左孩子和右孩子,fi 中存有其元素是主元的处理器号。开始时所有处 理器均将它们自己的处理器号写入变量 root,Aroot 是第一个主元,并且 root 被复制给每 个处理器 i 的 fi,然后那些其元素小于 Afi 的处理器将其号码写入 LCfi,而大于 Afi 的处理 器将其号码写入 RCfi。因此所有那些其元素属于小序列的处理器便将其号码写入 LCfi,而 所有那些其元素属于大于序列的处理器便将其号码写入 RCfi。但是因为并发写操作只有两 个值( 一个对应与 LCfi, 另一个对应与 RCfi) 能被写进这些单元, 所以这两个值就变成了下 次迭代所需要的主元的处理器号。按此算法一直继续到 n 个主元被选完。
6. 基于群集系统的快速排序的并行化方法
工作站群集 COW[9][10][11] Cluster Of Workstations) 又称工作站网络或 PC 群集 (PC Cluster) 是实现并行计算的一种新的主流技术#是一种并行或分布处理系统。它是基于消息传递的、 分布式存储的 NIMD 并行计算机结构,由一组互连的单机组成,可分为计算机节点和互连 网络两部分。 MPI(Message Passing Interface)[12][13]是消息传递并行编程模型的标准,它具有可移植 性、易用性、完备的异步通信功能、正式详细的精确定义等特点&。基于 MPI 编程就是用 标准串行语言(C 语言或者 Fortran 语言)书写的代码,加上用于消息接受和发送的库函数 调用 组成的,其计算其实是由一个或多个彼此通过调用库函数进行消息收、发的进程所组成。 最简单的并行化方法是以一个进程为开始,根据选取的枢轴把该进程划分成两个进程, 选取新的枢轴,用递归的方法把待排序列划分给若干进程,形成二叉树。每个进程由一个节 点负责排序,然后最终把结果返回到主节点#从而完成整个数列的排序。 伪代码如下:
4. 并行算法中的快速排序
并行计算是实现高性能计算的主要技术手段[5],排序问题是计算机科学中最重要的研究 问题之一。 对快速排序方法的研究表明, 至今快速排序算法仍然是流传久远的最实用的排序 算法。尽管在最坏情况下,它的平均情况下的时间复杂度相当好[6]。将串行的快速排序并行 化,必然能够提高对数据处理的效率。
[ ]
由于本文主要探讨快速算法的并行化, 故采用简化的方法, 直接选取数组的首个元素为 枢轴元素。
3. 归并排序简介
归并排序[4](MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采 用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完 全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个 有序表,称为二路归并。 归并排序具体工作原理如下( 假设序列共有 n 个元素) : ( 1) 将序列每相邻两个数字进行归并操作( merge) ,形成 floor( n /2) 个序列,排序后每 个序列包含两个元素; ( 2) 将上述序列再次归并,形成 floor( n /4) 个序列,每个序列包含四个元素; ( 3) 重复步骤( 2) ,直到所有元素排序完毕。