對a,b,c進行全排列輸出如
['a', 'b', 'c']
['a', 'c', 'b']
['b', 'a', 'c']
['b', 'c', 'a']
['c', 'b', 'a']
['c', 'a', 'b']
用遞歸思想來實現,大體思路:每個元素都會可能會充當新排列的隊頭,所以產生了一個for循環,複雜度是n用於交換頭部元素和第i個元素,交換完畢產生新的隊列,如
[‘b’, ‘a’, ‘c’]
接下來對第二個元素到隊位進行全排列(python中傳遞ls和倆座標, 切勿傳遞切片),直到傳入的座標重疊便是遞歸的出口,也可以在這裏先打印。因爲我們一直對ls進行排序,所以這裏我們對元素位置還原初始狀態是爲了進行下一次的排序。
整體思路很簡單,就是遞歸有序的交換元素。至於爲什麼會產生原順序的[‘a’, ‘b’, ‘c’],因爲我們每次都對第一個元素和第一個元素進行了交換。
def swap(ls, i, j):
ls[i], ls[j] = ls[j], ls[i]
def perm(ls, p, q):
if p == q:
print(ls)
return
for i in range(p, q+1, 1):
swap(ls, p, i)
perm(ls, p+1, q)
swap(ls, i, p) # 還原
if __name__ == "__main__":
# ls = ["a", "b", "c", "d"]
ls = ["a", "b", "c"]
num = len(ls)
for i in range(num):
swap(ls, 0, i)
perm(ls, 1, num-1) # 還原
swap(ls, i, 0)
一定要記得還原原來的數組。視頻講解鏈接