在没有任何两个元素以相同顺序排列的情况下,找到一个数组可以排列的所有排列的最快算法是什么?

What is the fastest algorithm to find all permutations one array can be arranged without having any two elements in the same order?

这个算法的实际应用是给2..N人一组中的每个人分配来自同一组人的不同目标人进行尽可能多的连续轮次尽可能。

我将这群人表示为一个数组。该数组将人的标识符保存为数字,例如,5 个人将创建一个数组 [1, 2, 3, 4, 5]。然后可以得出每个人的目标:

数组 [1, 2, 3, 4, 5] 可以生成以下缩写形式的目标:1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 = 1

我需要找到一种算法,找出具有 不同 个连续元素的所有排列(数组元素可以排序的不同顺序)。

例如,对于给定的数组,结果[2, 4, 3, 1, 5]是一个,因为你找不到2 before 4, 4 before 3, 3 before 1, 1 before 5 and 5 在 2 之前(注意我将数组作为循环处理)来自原始数组 [1, 2, 3, 4, 5].

一个包含 2 个元素(或人)的数组总是将彼此作为目标。这意味着具有输入 [1, 2] 的算法将只有一个结果:[1, 2]。将数组元素重新排序为 [2, 1] 并不重要,因为我们考虑数组循环:2 -> 1, 1 -> 2.

For [1, 2, 3] it's possible to find two permutations:
[1, 2, 3] (1 -> 2, 2 -> 3, 3 -> 1) and [2, 1, 3] (2 -> 1, 1 -> 3, 3 -> 2)

算法应该return数组的所有排列如下:

algorithm([1, 2, 3, 4, 5]) => [[1, 2, 3, 4, 5], [2, 4, 3, 1, 5], ...]

根据您的评论,我们可以得到输出,其中 1 和 2 相互定位,3 和 4 相互定位。 (这些输出无法以您选择的输出格式表示。)

在那种情况下,在从 1 到 N-1 的每一轮 i 中,让每个人都瞄准他们前面 i 个位置的人。