我所知道的全排列有四种:
1.迭代的排列组合全排列(非递归):字典序的大小,即传说中的A33
2.邻位置对换的全排列(非递归):
方法一:生成下一个排列,该方法对重复元素同样有效
如果可以根据一个排列生成他的下一个排列,那么生成所有排列也就不在话下了,下面以排列625431为例来说明怎么生成下一个排列,首先从右向左找到第一个降序对,这里是25,然后将前面的数字与其后面的大于它的最小数字相替换,这里是指将2与2后面的大于2的最小数字相替换,被替换数字是3,替换后的序列是635421,此时3后面的数字肯定是一个降序(从左到右)序列,将这个序列颠倒即可,得到631245,这就是625431的下一个序列,初始时应将元素排序,然后逐个生成;
方法二:生成第n个排列
m个元素的排列总数为m!; 假设m个元素初始时已经升序放入集合key中,则第n个排列的第一个元素必然是集合key中第n/(m-1)! 小元素,记为kx, 设定最小元素为第0小元素;接下来在集合key-{kx}中找出第n%(m-1)!个排列;以此类推,迭代找出所求排列的所有元素;
如果有重复元素,则m个元素的排列总数为m1! /(c1! * c2! *….cn!),ci为元素ki的重复次数;集合key也是一个多重集,对重复元素每次也只删除一个;
3.交换位置的递归全排列:代码展示
#all permutation
def printInfo():
print("test info")
def swap(array, end, start):
temp = array[end]
array[end] = array[start]
array[start] = temp
def isSwap(array, end, start):
for i in range(start, end):
if(array[i] == array[end]):
return False
return True
def all_Permutation(array, n):
if n == len(array):
print(array)
return
for i in range(n, len(array)):
if not isSwap(array,i, n):
return
swap(array,i,n)
all_Permutation(array, n+1)
swap(array, i, n)
if __name__ == '__main__':
array = ['a','c','c']
all_Permutation(array, 0)
4.索引数组选择的全排列:代码展示