Algorithm 生成不同订单的算法

Algorithm 生成不同订单的算法,algorithm,language-agnostic,Algorithm,Language Agnostic,我正在尝试编写一个生成不同集合的简单算法 (c)从(a)到(b)从 通过执行两个操作: 交换输入的第一个和第二个元素(abc),所以我得到(bac) 然后将第一个元素移到最后一个=>输入是(b a c),输出是(a c b) 所以这个过程的最终输出是(a,c,b) 当然,这个方法只生成一个cb和一个bc。我想知道使用这两个操作(可能是一行使用2个交换,然后使用一个移位,或者任何变体)是否足以生成所有不同的排序 我想提出一个简单的算法,不使用>

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

(c)从(a)到(b)从

通过执行两个操作:

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

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

所以这个过程的最终输出是(a,c,b)

当然,这个方法只生成一个cb和一个bc。我想知道使用这两个操作(可能是一行使用2个交换,然后使用一个移位,或者任何变体)是否足以生成所有不同的排序


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

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

所以你的问题本质上等同于下面的问题:是否有可能只使用相邻对交换来生成每个置换。如果是的话,有没有一个算法可以做到这一点


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

因为你不是用特定的语言提问,也许它更适合三个项目,您可以通过简单地交替任意两个不同的交换来进行交换,并将枚举所有六种排列。对于四个项目,一个解决方案是(21)(32)(43)(32)(43)(32)(21)(32)所有重复的三个项目,其中(32)表示交换第二和第三位置的元素。然而,我不知道一个普遍的解决办法。