排序网络 - 哪些网络允许跳过比较?

时间:2016-10-06 20:38:28

标签: sorting sorting-network

GCC的qsort实现使用中位数为3来选择一个支点。在此期间,3个元素使用排序网络进行排序。

3个元素的分类网络通常需要进行3次比较。但是在这个特定的实现中,可以跳过最后的比较,具体取决于之前的比较:

if(a[0] > a[1]) swap(a[0], a[1]);
if(a[1] > a[2]) swap(a[1], a[2]);
else goto jump;
if(a[0] > a[1]) swap(a[0], a[1]);
jump:;

对于具有n = 4...16的网络(具有已知最小最佳比较数的网络),是否可以执行类似的操作?如果是这样,它们会是哪些,它们会是什么样的?

更新 到目前为止,我找到了另一个网络,允许跳过一个比较:

// sorting network for 5 elements
if (a[0] > a[1]) { SWAP(a[0], a[1]); }
if (a[2] > a[3]) { SWAP(a[2], a[3]); }

if (a[1] > a[3]) { SWAP(a[1], a[3]); }
if (a[2] > a[4]) { SWAP(a[2], a[4]); }

if (a[0] > a[2]) { SWAP(a[0], a[2]); }
if (a[1] > a[4]) { SWAP(a[1], a[4]); }

if (a[1] > a[2]) { SWAP(a[1], a[2]); }
if (a[3] > a[4]) { SWAP(a[3], a[4]); }
else { goto jump; }

if (a[2] > a[3]) { SWAP(a[2], a[3]); }
jump:;

我用12345的所有排列对此进行了测试,并对所有排列进行了正确排序。

1 个答案:

答案 0 :(得分:0)

不考虑最佳排序网络,下图显示了使用大小为 n 的排序网络创建任意大小 n +1的排序网络然后执行的方法 n 进行额外比较以将最后一个元素放置到位(这通常是插入排序在转换为排序网络后的工作原理):

insertion sorting network n+1

图像非常明显,如果元素 n +1已经是最大的那个,那么你可以跳过比较元素 n 之后的每个比较器和 n +1。基本上,一旦 n 最后一个比较器返回false,您就跳过以下几个。在宏观方案中,我会说可以跳过大多数排序网络中的比较。

也就是说,一旦你的排序算法中有这样的条件,那么它就不再是一个排序网络了,你就失去了排序网络的好处:正确实现时不会出现分支预测问题。

如果你的目标只是用尽可能少的比较和交换对小集合进行排序,那么你可以unroll every possible path排序算法,然后为每个路径执行最佳的移动/交换次数,但是这样一个方法在4个元素之上变得完全不可维护,并且你的类型不太可能移动,并且比较操作的价格也不足以证明这种算法的合理性。

相关问题