列出n个元素的全排列结果

引入:例如我们只要看‘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')

你可能感兴趣的:(python,算法,数据结构)