姬長信(Redy)

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


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的所有排列测试了它,并且它正确地排序了所有这些排列.