我正在尝试编写一个生成不同集合的简单算法
来自(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)并始终移动某些位置(例如将第一个元素移动到最后一个)。
答案 0 :(得分:5)
请注意,移位操作(将第一个元素移动到结尾)相当于允许任何相邻对的交换(交换):您只需移动直到到达要交换的对,然后交换元素
因此,您的问题基本上等同于以下问题:是否可以仅使用相邻对交换生成每个排列。如果是的话,是否有算法可以做到这一点。
答案是肯定的(对于这两个问题)。其中一种算法叫做“Johnson-Trotter算法”,您可以在Wikipedia找到它。