Batcher的合并交换排序

时间:2010-12-09 20:46:38

标签: algorithm sorting

有没有人对Batcher的Merge-Exchange Sort有很好的指导/解释?

这与Batcher的bitonic排序或Batcher的奇偶合并排序算法不同,尽管许多文章假装它是。

4 个答案:

答案 0 :(得分:2)

Donald Knuth,计算机程序设计艺术,算法5.2.2M(第三卷,第111页)。

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

无济于事的是,“合并排序”一词有些含糊不清,我在讨论分类网络时经常看到它们。歧义是:它是通过合并排序的,还是合并排序的序列的?即使是已发表的论文,有时也会松散地使用“分类网络”和“合并网络”。我认为“合并网络”一词从未得到严格定义,并且具有相同的歧义。