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