有没有人对Batcher的Merge-Exchange Sort有很好的指导/解释?
这与Batcher的bitonic排序或Batcher的奇偶合并排序算法不同,尽管许多文章假装它是。
答案 0 :(得分:2)
Ken Batcher(1968),“Sorting networks and their application”, Proc。 AFIPS春季联合计算机会议 32:307-314。
答案 1 :(得分:1)
来自http://www.eli.sdsu.edu/courses/spring96/cs662/notes/batcher/batcher.html
Input: N and array A[1:N] of items to sort
set T = Ceiling(lg(N))
for P = 2T-1, 2T-2, 2T-3, ..., 1 do
R = 0, D = P
for Q = 2T-1, 2T-2, 2T-3, ..., P do
for (K = 1 to N - D ) and ((K-1) P) = R do in parallel
if A[K] > A[K + D] then
swap(A[K], A[K + D ])
end if
end for
D = Q - P
R = P
end for
end for
(K + 1) P means logical and of K and P
If number of processors is less than N than the swap becomes a merge
This site具有此算法的可视化效果
答案 2 :(得分:0)
简单实施:)
int FloorLog2(int value)
{
int result = -1;
for (int i = 1; i < value; i <<= 1, ++result);
return result;
}
void BatcherSort(int* array, int length)
{
int t = FloorLog2(length);
int p0 = (1 << t);
int p = p0;
do
{
int q = p0;
int r = 0;
int d = p;
while (r == 0 || q != p)
{
if (r != 0)
{
d = q - p;
q >>= 1;
}
for (int i = 0; i < length - d; ++i)
{
if (((i & p) == r) && array[i] > array[i + d])
{
int swap = array[i];
array[i] = array[i + d];
array[i + d] = swap;
}
}
r = p;
}
p >>= 1;
}
while (p > 0);
}
答案 3 :(得分:0)
经过深思熟虑之后,我有了一些答案。让我有点失望的一件事是K.E.在其大学的Batcher网站上,他自己提到他是两种分类算法的发现者。 “奇偶合并排序和双位合并排序”,指的是他在1968年发表的论文。 (http://www.cs.kent.edu/~batcher/和http://www.cs.kent.edu/~batcher/sort.pdf)
我认为之所以会引起混淆,是因为奇偶合并排序(如本文所述)是合并网络,而不是排序网络。但是,由于设计可以扩展到更大和更小的合并网络,因此可以轻松构建分类网络。在我看来,这通常被称为“分批的合并交换排序”。似乎Knuth在“计算机编程艺术”中。第3卷。排序和搜索。第二版在讨论“算法M(合并交换)”时使用了该术语。 (pg111)
即使是维基百科也很奇怪,将奇偶合并网络(但实际上,是它的多个实例化,构成合并交换排序网络,如果可以的话)描述为排序网络。 (https://en.wikipedia.org/wiki/Batcher_odd–even_mergesort)
无济于事的是,“合并排序”一词有些含糊不清,我在讨论分类网络时经常看到它们。歧义是:它是通过合并排序的,还是合并排序的序列的?即使是已发表的论文,有时也会松散地使用“分类网络”和“合并网络”。我认为“合并网络”一词从未得到严格定义,并且具有相同的歧义。