引入:例如我们只要看‘1’和‘2’的全排列情况,那么我们可以这样做:先将‘1’放置(排列)在这里(毫无疑问,只有一种情况,那就是‘1’),然后再来放置‘2’,
那么此时,‘2’有两个位置可以放置(一个是‘1’的左侧,一个是‘1’的右侧),
那么这样防置之后就出现了两种排列(即‘1,2’和‘2,1’)这也就是这两个元素的全排列了。
如果求3个数的全排列问题,那就是在2个数全排列的基础之上,去看‘3’的位置到底如何摆放,
同理也可解决n个元素的全排列问题。
具体算法讲解:
1.从用户那里获取一个元素列表
2.创建一个用来放置排列的列表1和列表2
3.循环(讲解)
将第1个元素进行排列并将获取的排列放置在存储排列的列表1里
将第2个元素尝试插在列表1中的不同排列中的不同位置以获取新的排列,然后将此排列存储到列表2中并删除列表1的所有内容
将第3个元素尝试插在列表1中的不同排列中的不同位置以获取新的排列,然后将此排列存储到列表1中并删除列表2的所有内容
将第4个元素尝试插在列表1中的不同排列中的不同位置以获取新的排列,然后将此排列存储到列表2中并删除列表1的所有内容
直到所有的元素全部都被插入完(放置完)即可获得这n个元素的全排列
(注意:当n为奇数时,全排列存储在列表1中,当n为偶数时,全排列存储在列表2中)
4.通过判断n的奇偶性来选择列表1或列表2来输出n个元素的所有全排列
"""给定一组元素,对其进行全排列"""
import copy
#从用户那里获取一组元素
print('Please enter the elements and use "over" as the identifier to end the input:')
elements=[]
n=0#用来记录用户输入了多少个元素
while True:
a=input()
if a=='over':
break
else:
elements.append(a)
n+=1
#建立一个列表1和列表2用来存储排列情况
permutation_1=[]
permutation_2=[]
a_permutation=[]
permutation_1=[[elements[0]]]#列出(排列第一个元素)的排列
#按照预设的算法执行
for i in range(1,n):#(循环)选定待放置(插入)的元素
if (i+1)%2==0:#判断是用列表1还是列表2来储存即将生成的新排列
for j in range(0,len(permutation_1)):#(循环)选定之前排列好的排列
for k in range(0,i+1):#(循环)开始在每一个排列里可以插入元素的位置上插入元素
a_permutation=copy.deepcopy(permutation_1[j])
a_permutation.insert(k,elements[i])
permutation_2.append(a_permutation)
for m in range(0,len(permutation_1)):#清空列表1
del permutation_1[0]
else:
for j in range(0,len(permutation_2)):#(循环)选定之前排列好的排列
for k in range(0,i+1):#(循环)开始在每一个排列里可以插入元素的位置上插入元素
a_permutation=copy.deepcopy(permutation_2[j])
a_permutation.insert(k,elements[i])
permutation_1.append(a_permutation)
for m in range(0,len(permutation_2)):#清空列表2
del permutation_2[0]
if n%2==1:#判断是用列表1还是列表2来输出获取的全排列
for l in range(0,len(permutation_1)):
print(f'{permutation_1[l]}\n')
else:
for l in range(0,len(permutation_2)):
print(f'{permutation_2[l]}\n')