我想写一个算法(c ++) 以这种方式读取6个数字:
x1> x2> X3
和
y1> y2> Y3
我们知道这两个陈述 但现在我们想要使用基本语法和最小比较
对所有6个数字进行排序我该怎么办?
非常感谢!!
答案 0 :(得分:1)
有20种组合,所以理想的分割可以通过5次比较完成。 (2 ** 5允许32组)。
// x1 x2 x3 y1 y2 y3
// x1 x2 y1 x3 y2 y3
// x1 x2 y1 y2 x3 y3
// x1 x2 y1 y2 y3 x3
// x1 y1 x2 x3 y2 y3
// x1 y1 x2 y2 x3 y3
// x1 y1 x2 y2 y3 x3
// x1 y1 y2 y3 x2 x3
// x1 y1 y2 x2 y3 x3
// x1 y1 y2 x2 x3 y3
// y1 x1 y2 y3 x2 x3
// y1 x1 y2 x2 y3 x3
// y1 x1 y2 x2 x3 y3
// y1 x1 x2 x3 y2 y3
// y1 x1 x2 y2 x3 y3
// y1 x1 x2 y2 y3 x3
// y1 y2 y3 x1 x2 x3
// y1 y2 x1 y3 x2 x3
// y1 y2 x1 x2 y3 x3
// y1 y2 x1 x2 x3 y3
首先与x1 < y1
分开,形成两组10个
// x1 x2 x3 y1 y2 y3
// x1 x2 y1 x3 y2 y3
// x1 x2 y1 y2 x3 y3
// x1 x2 y1 y2 y3 x3
// x1 y1 x2 x3 y2 y3
// x1 y1 x2 y2 x3 y3
// x1 y1 x2 y2 y3 x3
// x1 y1 y2 y3 x2 x3
// x1 y1 y2 x2 y3 x3
// x1 y1 y2 x2 x3 y3
和
// y1 x1 y2 y3 x2 x3
// y1 x1 y2 x2 y3 x3
// y1 x1 y2 x2 x3 y3
// y1 x1 x2 x3 y2 y3
// y1 x1 x2 y2 x3 y3
// y1 x1 x2 y2 y3 x3
// y1 y2 y3 x1 x2 x3
// y1 y2 x1 y3 x2 x3
// y1 y2 x1 x2 y3 x3
// y1 y2 x1 x2 x3 y3
这两组将使用相同的逻辑,因此使用以x1
开头的组:
我们可以拆分y1 < x2
(第二次拆分)
// x1 x2 x3 y1 y2 y3
// x1 x2 y1 x3 y2 y3
// x1 x2 y1 y2 x3 y3
// x1 x2 y1 y2 y3 x3
// x1 y1 x2 x3 y2 y3
// x1 y1 x2 y2 x3 y3
// x1 y1 x2 y2 y3 x3
// x1 y1 y2 y3 x2 x3
// x1 y1 y2 x2 y3 x3
// x1 y1 y2 x2 x3 y3
对于第一组4,我们必须将x3
置于所有y
之间的正确位置:
x3 < y2
分开,然后根据与y1
或y3
进行比较(另外2次拆分 - > 4次比较)对于第二组(6种可能性):
首先按x2 < y2
分割(第3次分割)
// x1 y1 x2 x3 y2 y3
// x1 y1 x2 y2 x3 y3
// x1 y1 x2 y2 y3 x3
// placing x3 correctly with y2, y3 (2 split required -> total 5 comparisons)
// x1 y1 y2 y3 x2 x3
// x1 y1 y2 x2 y3 x3
// x1 y1 y2 x2 x3 y3
// placing y3 correctly with x2, x3
作为练习,你可以尝试不同的分割(例如首先用x2 < y2
分割),你的分割应该将剩余的组分成2个相似大小的子组。 (一组最多2**N
应形成两组最多2**(N-1)
作为10(<= 16
)的组,其组成一组4和一组6({{ 1}}))。