我正试图掌握Batcher Sort的概念。但是,我在网上找到的大多数资源都完全依赖于证明或低级伪代码。在我查看校样之前,我想了解Batcher Sort的工作原理。有人可以高度概述Batcher Sort的工作原理(特别是合并),而不会过于冗长的伪代码(我想了解Batcher Sort背后的想法,而不是实现它)?谢谢!
答案 0 :(得分:1)
Batcher的排序是与Batcher合并的合并。
要合并两个数组A和B,Batcher的合并以正向顺序连接A和B以相反顺序连接,创建一个bitonic数组。然后它应用Batcher的bitonic排序。
Batcher的bitonic排序是quicksort的堂兄。它将数组分成两半,进行一些交换以确保前半部分中的元素不大于第二部分中的元素,并递归地对这两部分进行排序。
如果可以旋转阵列使其元素增加然后减少,则阵列是bitonic的。对于不经意的排序的零一原则,足以证明零输入的正确性,我们现在就做出这个假设。可能性是
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为bitonic,或A为bitonic,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是bitonic。如果w< y,然后
A = 0^w 1^(y-w) 0^z
B = 1^(y+z)
所以B都是1,A是bitonic。如果我们递归地对A和B进行排序,那么它们的串联就是排序数组。