Batcher 的排序是 mergesort 与 Batcher 的合并。
为了合并两个数组 A 和 B,Batcher 的合并将 A 正序与 B 反序连接,创建一个双调数组。然后应用 Batcher 的双调排序。
Batcher 的双调排序是快速排序的表亲。它将数组分成两半,进行一些交换以确保前半部分中没有元素大于后半部分中的元素,并对两半部分进行递归排序。
一个数组是双调的,如果它可以旋转使得它的元素增加然后减少。根据遗忘排序的零一原则,证明零一输入的正确性就足够了,我们现在做出这个假设。可能性是
0^a 1^b 0^c = 0 ... a copies ... 0 1 ... b copies ... 1 0 ... c copies ... 0 (rotate right by c positions)
和
1^a 0^b 1^c (rotate left by a positions)
其中 a、b、c 是非负整数。双调排序首先将该数组分成大小相等的两半 A 和 B。有两种可能性:
A = 0^w
B = 1^x 0^y 1^z
或
A = 0^w 1^x
B = 1^y 0^z
或
A = 0^w 1^x 0^y
B = 1^z
或其他三个零和一互换。 Batcher 的见解是,通过将所有 i 的比较器应用于 A[i]、B[i],要么 A 全为零,B 为双调,要么 A 为双调,B 全为 1。无论哪种方式,都满足递归排序的先决条件。
唯一不平凡的情况是
A = 0^w 1^x
B = 1^y 0^z
及其补语。如果 w >= y,则 A, B 变为
A = 0^(w+x)
B = 1^y 0^(w-y) 1^x
所以A全为零,B是双调的。如果 w
A = 0^w 1^(y-w) 0^z
B = 1^(y+z)
所以 B 是全一,A 是双调的。如果我们对 A 和 B 进行递归排序,那么它们的串联就是排序后的数组。