一般有三种算法实现全排列:
1.依次交换元素到首位,然后求解子问题。例如,要求解(1,2,3)的全排列,等价于求解1和(2,3)的全排列,2和(1,3)的全排列,以及3和(1,2)的全排列。于是,将当前集合中的每个元素依次交换到首位,然后递归求解余下元素的全排列。
2.标记+回溯法。每次从当前集合中取出一个未标记的元素,将它加入到序列尾部,然后标记为已使用。重复上述过程直到集合为空,输出此时得到的序列。然后回溯,继续尝试下一个未标记的元素。
3.非递归的字典序算法。核心思想是将当前序列的状态转移到字典序中下一个序列的状态。具体算法可以自行搜索学习。
图片中的代码是第2种方法。