有很多算法可以生成排列。我发现其中最简单的一个是Heap算法:
它通过选择一对元素进行交换来从前一个排列生成每个排列。
上面的链接概述了这个想法和打印排列的伪代码。这是我实现的该算法,它返回所有的排列。
func permutations(arr []int)[][]int{
var helper func([]int, int)
res := [][]int{}
helper = func(arr []int, n int){
if n == 1{
tmp := make([]int, len(arr))
copy(tmp, arr)
res = append(res, tmp)
} else {
for i := 0; i < n; i++{
helper(arr, n - 1)
if n % 2 == 1{
tmp := arr[i]
arr[i] = arr[n - 1]
arr[n - 1] = tmp
} else {
tmp := arr[0]
arr[0] = arr[n - 1]
arr[n - 1] = tmp
}
}
}
}
helper(arr, len(arr))
return res
}
以下是如何使用它的示例(Go playground):
arr := []int{1, 2, 3}
fmt.Println(permutations(arr))
[[1 2 3] [2 1 3] [3 2 1] [2 3 1] [3 1 2] [1 3 2]]
需要注意的是,排列并不按字典顺序排序(就像您在 itertools.permutations
中看到的那样)。如果出于某种原因您需要对其进行排序,我发现一种方法是从阶乘数系统生成它们(在排列部分
中有描述,并允许快速找到第n个字典序排列)。
P.S. 您也可以查看其他人的代码 这里 和 这里