生成不同订单的算法

时间:2012-03-08 21:27:35

标签: algorithm language-agnostic

我正在尝试编写一个生成不同集合的简单算法

  来自(a b c)的(p b a)(c a b)(b a c)(b c a)(a c b)

做两个操作:

交换输入的第一和第二个元素(a b c),所以我得到(b a c)

然后将第一个元素移到last =>输入是(b a c),输出是(a c b)

所以这个程序的最终结果是(a c b)。

当然,此方法仅生成c b和a b c。我想知道是否使用这两个操作(可能连续使用2个交换然后换班,或任何变化)足以产生所有不同的排序?

我想提出一个简单的算法,而不是使用> <或+,只需反复交换某些位置(例如总是交换位置1和2)并始终移动某些位置(例如将第一个元素移动到最后一个)。

1 个答案:

答案 0 :(得分:5)

请注意,移位操作(将第一个元素移动到结尾)相当于允许任何相邻对的交换(交换):您只需移动直到到达要交换的对,然后交换元素

因此,您的问题基本上等同于以下问题:是否可以仅使用相邻对交换生成每个排列。如果是的话,是否有算法可以做到这一点。

答案是肯定的(对于这两个问题)。其中一种算法叫做“Johnson-Trotter算法”,您可以在Wikipedia找到它。