用最少的比较对6个数字进行排序

时间:2017-10-25 12:58:25

标签: algorithm sorting

我想写一个算法(c ++) 以这种方式读取6个数字:

x1> x2> X3

y1> y2> Y3

我们知道这两个陈述 但现在我们想要使用基本语法和最小比较

对所有6个数字进行排序

我该怎么办?

非常感谢!!

1 个答案:

答案 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分开,然后根据与y1y3进行比较(另外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}}))。