排序算法之:基于比较的排序网络中奇偶归并排序(Odd-Even Mergesort)的递归构造与并行实现
字数 2615 2025-12-16 21:39:13
排序算法之:基于比较的排序网络中奇偶归并排序(Odd-Even Mergesort)的递归构造与并行实现
题目描述
奇偶归并排序是一种基于比较网络的排序算法,由Ken Batcher在1968年提出。它属于双调排序的“近亲”,也是一种可以高效并行化的排序方法。题目要求深入理解其递归构造原理,掌握如何从递归描述转化为具体的比较网络结构,并分析其在并行计算模型下的实现方式与性能。
解题思路
我们可以将这个复杂的任务分解为几个递进的步骤,从核心思想、递归构造,到网络可视化,再到并行性分析。
详细解题步骤
第一步:理解核心思想——奇偶归并与0-1原理
- 基本目标: 排序网络由一系列固定的“比较-交换”单元构成,每个单元比较两根“线”上的值,并根据比较结果决定是否交换。奇偶归并排序就是一个由这些单元构成的网络。
- 核心操作: 算法的核心是“奇偶归并”操作。给定两个已排序的输入序列A和B,奇偶归并网络可以将它们合并成一个已排序的输出序列。其思路是将输入线按索引分为“奇数”线和“偶数”线,分别对奇数组和偶数组进行归并,然后再对相邻的奇偶线对进行比较交换。这是一个递归过程。
- 理论基石:0-1原理: 要证明一个由比较-交换单元构成的网络能对任意序列排序,只需证明它能对所有仅由0和1组成的序列正确排序。这大大简化了网络正确性的证明,我们后续的设计和推理都将依赖此原理。
第二步:掌握递归构造规则
递归构造是整个算法的骨架。假设我们要构建一个能对N个元素排序的奇偶归并网络OE(N)。N必须是2的幂。
- 递归基: 当N=1时,网络为空(一个元素自然有序)。
- 递归步骤: 要构造OE(N):
- 第一步:拆分。 递归地构造两个能对N/2个元素排序的网络,分别对输入序列的前半部分和后半部分进行排序。这一步称为二分递归排序。
- 第二步:合并。 将两个已排序的N/2序列,用一个“奇偶归并网络”OEM(N)合并成一个N元素的已排序序列。这个合并网络本身也是递归构造的。
那么,关键的奇偶归并网络OEM(N) 如何递归构造?
- 输入: 两个已排序的长度为m的序列(
N = 2*m),记为a[0..m-1]和b[0..m-1]。 - 构造规则:
- 递归基: 如果
m=1,那么归并网络只有一个比较-交换单元,比较a[0]和b[0]。 - 递归步骤:
- 分别构造两个奇偶归并网络OEM(m),用于合并奇数和偶数索引的元素。
- 偶数归并网络: 输入是
a[0], a[2], a[4]...和b[0], b[2], b[4]...,输出一个长度为m的排序序列E[0..m-1]。 - 奇数归并网络: 输入是
a[1], a[3], a[5]...和b[1], b[3], b[5]...,输出一个长度为m的排序序列O[0..m-1]。
- 偶数归并网络: 输入是
- 将第一步得到的
E和O序列交错排列,形成最终输出序列c[0..2m-1],其中c[2*i] = E[i],c[2*i+1] = O[i]。 - 最后,对相邻的
c[2*i]和c[2*i+1](即E[i]和O[i])进行一轮比较-交换(称为“完美洗牌”后比较)。这一步是确保最终序列全局有序的关键校正步骤。
- 分别构造两个奇偶归并网络OEM(m),用于合并奇数和偶数索引的元素。
- 递归基: 如果
第三步:以N=8为例,可视化构造过程
让我们画一个简化的构造图来加深理解(这里用文字描述结构,请尝试在纸上绘制)。
- 目标: 构建OE(8)。
- 第一步(递归排序):
- 构建OE(4)对输入索引
[0,1,2,3]的元素排序。 - 构建另一个OE(4)对输入索引
[4,5,6,7]的元素排序。
- 构建OE(4)对输入索引
- 第二步(合并): 用一个OEM(8)合并两个已排序的4元素子序列。
- 要构建OEM(8),需要合并两个长度为4的序列
a和b。 - 递归地,需要构建OEM(4)合并偶数索引元素(
a0,a2和b0,b2),以及另一个OEM(4)合并奇数索引元素(a1,a3和b1,b3)。 - 对于每个OEM(4),它又依赖于OEM(2)…
- 最终,最底层的操作是两两之间的比较-交换单元。
- 要构建OEM(8),需要合并两个长度为4的序列
网络形态: 最终画出的OE(8)网络看起来是分层(级)的,每级内包含多个独立的比较-交换单元。比较器的连接模式呈现出“递归的奇偶交错”特征。网络的总深度(并行步骤数)约为 (log₂N) * (log₂N + 1) / 2, 对于N=8,深度为6。这比双调排序网络(深度6)相同,但连接模式不同。
第四步:并行实现与性能分析
- 并行性来源: 排序网络的每一“级”或每一“步”中的所有比较-交换操作彼此独立,因为它们作用于不同的、不相交的元素对。因此,可以在一个并行计算步骤中同时完成。
- 并行算法设计:
- 可以将输入数组分布到P个处理器上。
- 算法的执行过程就是按照网络的“深度”逐步推进。
- 在每一级,处理器之间需要根据网络连接模式进行通信(比较和可能的交换数据)。
- 由于网络结构是静态的、固定的,通信模式是预先知道的,非常适合在SIMD(单指令多数据)机器或互连网络(如超立方体)上实现。
- 复杂度分析:
- 时间复杂度: 在PRAM(并行随机存取机器)模型下,假设有无限多个处理器,排序N个元素的时间复杂度等于网络深度
O(log²N)。如果处理器数P=N,则总时间为O(log²N)。这比最优的基于比较的排序下界O(log N)要差,但它是一种简单、规则、可扩展的并行方案。 - 工作量: 网络总的比较-交换单元数量约为
O(N * log²N),这与串行最优的O(N log N)相比也更大。因此,它是一种“以更多比较换取规则性和并行性”的算法。 - 比较: 与双调排序相比,两者深度相同
O(log²N),工作量也相近。奇偶归并的网络连接在某些硬件上可能更规则,但两者思想同源,都属于基于比较网络的经典并行排序算法。
- 时间复杂度: 在PRAM(并行随机存取机器)模型下,假设有无限多个处理器,排序N个元素的时间复杂度等于网络深度
总结
奇偶归并排序网络的核心在于其优雅的递归构造:通过递归地将排序问题分解为更小的排序和奇偶归并子问题,最终形成一个由比较-交换单元构成的固定网络。其正确性由0-1原理保证。其最大的价值在于固有的、规则的并行性,使得它非常适合在并行计算机硬件上实现。虽然其理论渐进复杂度不是最优,但其结构的规整性和可预测性,使其在特定并行体系结构和作为教学范例上,具有重要意义。