python 按字典序全排列實現

2021-10-21 13:47:53 字數 982 閱讀 5642

def swap(num, i, j):

for x in range(j, i, -1):

tmp = num[x]

num[x] = num[x-1]

num[x-1] = tmp

def swapback(num, i, j):

for x in range(i, j):

tmp = num[x]

num[x] = num[x+1]

num[x+1] = tmp

def permutation(numbers, start):

if start == len(numbers) - 1:

print(" ".join(numbers))

else:

for i in range(start, len(numbers)):

swap(numbers, start, i)

permutation(numbers, start + 1)

swapback(numbers, start, i)

def func():

num = int(input())

numbers =

for i in range(1, num + 1):

permutation(numbers, 0)

if __name__ == "__main__":

func()

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

遞迴實現全排列的同時,需要保證能夠按照字典序輸出。

起始列表按序儲存,在調換位置時,將要調換的值從後往前迴圈移到start位置而非直接交換兩個點的位置,保證後半部分數值能保持大小順序。

1 2 3

1 3 2

2 1 3

2 3 1

3 2 1

3 1 2

全排列(按字典序)

描述 給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小...

全排列 字典序排列

include includeusing namespace std define dig num 4 void cal int str int first int last cout endl if first last bool get f l int list int former int l...

字典序全排列

思路 從左向右找到不符合遞增規律的第乙個數,比如1,2,5,4,3中的這個數就是2,將其與其右面遞增序列中的比他大的最小數,比如在前面例子中的3互換,得到1,3,5,4,2,最後,將該數右邊的遞增序列排序,得到1,3,2,4,5即可。上面這個是求某乙個數的下乙個排列,而全排列只需按這個思路,將初始陣...