GCC实现的
对于3个元素的排序网络通常需要3次比较。但在这个特定的实现中,最后一次比较可以根据前面的比较而省略。
qsort
使用中位数法来选择枢轴。在此过程中,这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排列组合,这个程序都能正确地排序。