对于我的应用程序,我实际上只关心5个元素的中位数,而不是实际地将它们排序。也就是说,在结果中其他4个元素的顺序可能未指定,只要中位数最终在正确的位置即可。是否可以使用与排序网络相关的方法来计算中位数,以比执行完整排序更少的交换次数?如果可以,这样的解决方案(对于n=5和其他情况)也将成为一个很好的答案。
(注意:我标记了C语言的问题,因为C语言是我使用的语言,我认为关注C标签的人有好的答案,但如果答案易于转换为C语言,则我并不在乎答案实际上是用C编写还是伪代码编写的,只要满足上述标准即可。)
----------
- 2-input: 1 network
[[1 2]]
----------
- 3-input: 6 networks
[[1 2][1 3][2 3]]
[[1 2][2 3][1 2]]
[[1 3][1 2][2 3]]
[[1 3][2 3][1 2]]
[[2 3][1 2][2 3]]
[[2 3][1 3][1 2]]
----------
- 4-input: 3 networks
[[1 2][3 4][1 3][2 4][2 3]]
[[1 3][2 4][1 2][3 4][2 3]]
[[1 4][2 3][1 2][3 4][2 3]]
----------
- 5-input: 180 networks
[[1 2][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 2][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 4][1 3][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 2][3 4][1 3][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 2][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 4][1 4][3 5][1 3][2 5][2 3][4 5][3 4]]
[[1 2][3 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 2][3 4][1 5][2 4][1 3][2 5][2 3][4 5][3 4]]
[[1 2][3 4][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 2][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]]
[[1 2][3 4][2 4][3 5][1 3][2 5][2 3][4 5][3 4]]
[[1 2][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 2][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 5][1 3][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 2][3 5][1 3][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 2][3 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 2][3 5][1 4][2 5][1 3][2 4][2 3][4 5][3 4]]
[[1 2][3 5][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 2][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 2][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 2][3 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 2][4 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 2][4 5][1 3][2 5][1 4][2 3][2 4][3 5][3 4]]
[[1 2][4 5][1 3][2 5][2 4][3 5][1 2][3 4][2 3]]
[[1 2][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 2][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 2][4 5][1 4][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 2][4 5][1 4][3 5][2 5][3 4][1 3][2 4][2 3]]
[[1 2][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 2][4 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 2][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 2][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 2][4 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 3][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 3][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 4][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 3][2 4][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 3][2 4][1 4][2 5][1 2][3 5][2 3][4 5][3 4]]
[[1 3][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 3][2 4][1 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 3][2 4][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 3][2 4][2 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 3][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 3][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 3][2 5][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 3][2 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 3][2 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][2 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
[[1 3][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 3][2 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]]
[[1 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]]
[[1 3][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 3][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][4 5][1 4][2 5][2 4][3 5][1 2][3 4][2 3]]
[[1 3][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
[[1 3][4 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 3][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 4][2 3][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 4][2 3][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 4][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 4][2 3][1 3][2 5][1 2][4 5][2 4][3 5][3 4]]
[[1 4][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 4][2 3][1 5][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 3][1 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 3][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 4][2 3][2 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 4][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 4][2 5][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][2 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 4][2 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[1 4][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 4][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[1 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 4][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][3 5][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[1 4][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 4][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 5][2 3][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 5][2 3][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 5][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 5][2 3][1 3][2 4][1 2][4 5][2 4][3 5][3 4]]
[[1 5][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 5][2 3][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 3][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 3][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 3][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 5][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 5][2 4][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 5][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 5][2 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[1 5][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 5][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[1 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 5][3 4][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[1 5][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 5][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]]
[[2 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[2 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]]
[[2 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]]
[[2 3][4 5][1 3][2 4][1 2][4 5][2 4][3 5][3 4]]
[[2 3][4 5][1 3][2 4][1 4][3 5][1 2][3 4][2 3]]
[[2 3][4 5][1 3][2 5][1 4][3 5][1 2][3 4][2 3]]
[[2 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
[[2 3][4 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[2 3][4 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[2 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
[[2 3][4 5][1 5][2 4][1 4][3 5][1 2][3 4][2 3]]
[[2 3][4 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[2 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[2 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[2 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[2 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[2 4][3 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[2 4][3 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[2 4][3 5][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[2 4][3 5][1 4][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 4][3 5][1 4][2 5][1 3][4 5][1 2][3 4][2 3]]
[[2 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[2 4][3 5][1 5][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 4][3 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[2 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[2 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[2 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[2 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[2 5][3 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[2 5][3 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[2 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[2 5][3 4][1 4][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 5][3 4][1 4][3 5][1 2][4 5][1 3][2 4][2 3]]
[[2 5][3 4][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[2 5][3 4][1 5][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 5][3 4][1 5][2 4][1 3][4 5][1 2][3 4][2 3]]
----------
- 6-input: 90 networks
[[1 2][3 4][5 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 2][3 4][5 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 2][3 4][5 6][1 4][2 6][3 5][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 2][3 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 2][3 4][5 6][1 5][2 4][3 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 2][3 4][5 6][1 6][2 4][3 5][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 2][3 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 2][3 5][4 6][1 4][2 5][3 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 3][2 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 2][3 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 2][3 6][4 5][1 4][2 6][3 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 3][2 4][5 6][1 4][2 5][3 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 3][2 4][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 3][2 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 3][2 5][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 3][2 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 3][2 6][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 4][2 3][5 6][1 3][2 5][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 4][2 3][5 6][1 5][2 4][3 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 5][2 3][4 6][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 5][2 3][4 6][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 6][2 3][4 5][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 6][2 3][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
n!
个输入就足够了,实际上2 ** n
也可以(参见https://en.wikipedia.org/wiki/Sorting_network#Zero-one_principle)。Michael Codish、Luís Cruz-Filipe、Thorsten Ehlers、Mike Müller和Peter Schneider-Kamp. "Sorting networks: to the end and back again." Journal of Computer and System Sciences (2016) 表1显示,对于n=5,比较交换的最小数量是9,网络的最小深度是5。由于每个比较交换等价于两个min/max操作,所以所需的最小min/max操作数为18。
Lukáŝ Sekanina,"Evolutionary Design Space Exploration for Median Circuits". In: EvoWorkshops,2004年3月,第240-249页,在表1中给出了实现最优五输入中位数选择网络所需的最小min/max操作数为10。
William Gasarch、Wayne Kelly和William Pugh。"Finding the i th largest of n for small i, n." ACM SIGACT News 27, no. 2 (1996): 88-96,表1:中位数-of-5至少需要6次比较。
一般来说,具有最小操作数的排序网络并不能简单地通过消除冗余操作来降低到具有最小操作数的中位数选择网络。但是,可以找到在至少一些值的情况下以最优方式减少的网络。对于n=5,暴力搜索这样的网络是可行的。
下面的代码显示了由九个比较交换操作或18个min/max操作组成的五输入排序网络的四个变体。当使用FULL_SORT = 0
编译时,这些变体将转化为具有10个min/max操作的中位数选择网络。因此,根据这个度量标准,排序和中位数选择都是最优的。
然而,当作为排序网络使用时,所有四个变体的深度均为6,而不是最小的5。另外,当基于比较而不是min/max操作配置为基于中位数选择的网络时,所有网络都需要7次比较,而不是最小的6次比较。
来自Compiler Explorer (godbolt)的示例编译结果:使用18个min/max操作进行五输入排序,使用10个min/max操作进行五输入中位数选择。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define VARIANT 1
#define USE_MIN_MAX 1
#define FULL_SORT 0
typedef float T;
#if USE_MIN_MAX
#define MIN(a,b) ((T)(fmin(a,b)))
#define MAX(a,b) ((T)(fmax(a,b)))
#define SWAP(i,j) do { T s = MIN(a##i,a##j); T t = MAX(a##i,a##j); a##i = s; a##j = t; } while (0)
#else // USE_MIN_MAX
#define MIN(a,b) (((a) > (b)) ? (b) : (a))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define SWAP(i,j) do { if (a##i > a##j) { T temp = a##i; a##i = a##j; a##j = temp; }} while (0)
#endif // USE_MIN_MAX
/* Use sorting/median network to fully or partially sort array of five values
and return the median value
*/
T network5 (T *a)
{
// copy to scalars
T a0, a1, a2, a3, a4;
a0=a[0];a1=a[1];a2=a[2];a3=a[3];a4=a[4];
#if VARIANT == 1
SWAP (0, 1); SWAP (2, 3);
SWAP (0, 2); SWAP (1, 3);
SWAP (2, 1);
SWAP (1, 4);
SWAP (1, 2);
SWAP (0, 1); SWAP (3, 4);
#elif VARIANT == 2
SWAP (3, 4); SWAP (0, 2);
SWAP (2, 4); SWAP (0, 3);
SWAP (2, 3);
SWAP (1, 2);
SWAP (0, 1); SWAP (2, 3);
SWAP (3, 4);
#elif VARIANT == 3
SWAP (3, 2); SWAP (0, 4);
SWAP (2, 4); SWAP (0, 3);
SWAP (2, 3);
SWAP (1, 2);
SWAP (0, 1); SWAP (2, 3);
SWAP (3, 4);
#elif VARIANT == 4
SWAP (2, 4); SWAP (0, 1);
SWAP (0, 2); SWAP (1, 4);
SWAP (2, 3);
SWAP (1, 2);
SWAP (2, 3); SWAP (0, 1);
SWAP (3, 4);
#else
#error unsupported VARIANT
#endif
#if FULL_SORT
// copy back sorted results
a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;
#endif
// return median-of-5
return a2;
}
这段文字太长了,不适合作为评论。Falken教授在上面的回答可以通过以下方式在MATLAB中进行验证:使用一些查找/替换或正则表达式技巧,编写代码。
sn{3} = [...
[[1,2],[1,3],[2,3]];...
[[1,2],[2,3],[1,2]];...
[[1,3],[1,2],[2,3]];...
[[1,3],[2,3],[1,2]];...
[[2,3],[1,2],[2,3]];...
[[2,3],[1,3],[1,2]];
];
对于其他n值同样如此,然后运行
for n = 3:6
test_in = cellfun(@str2num,num2cell(dec2bin(0:(2^n-1),n)));
for j = 1:size(sn{n},1)
test_out = test_in;
for k = 1:2:size(sn{n},2)
temp1 = test_out(:,sn{n}(j,k));
temp2 = test_out(:,sn{n}(j,k+1));
ind = temp2 < temp1;
test_out(ind,sn{n}(j,k)) = temp2(ind);
test_out(ind,sn{n}(j,k+1)) = temp1(ind);
end
end
test = cellfun(@issorted,mat2cell(test_out,ones(1,2^n),n));
assert(all(test),['n = ',num2str(n),' failed test']);
end
这些断言对于每个 n 的值都成立。
n
很小,一个好的实现方法是使用指针/索引数组,并在指针数组中执行交换。 - R.. GitHub STOP HELPING ICE