实现对数组的全排列有多种方法,本文主要叙述利用普通递归和深度优先算法两种方法对数组进行全排列的主要思想,另外给出基于Python语言的实现。
举个例子,比如你要对a,b,c三个字符进行全排列,那么它的全排列有abc,acb,bac,bca,cba,cab这六种可能,你们想想你们是如何得出这六种可能的。没错!就是当指针指向第一个元素a时,它可以是其本身a(即和自己进行交换),还可以和b,c进行交换,故有3种可能,当第一个元素a确定以后,指针移向第二位置,第二个位置可以和其本身b及其后的元素c进行交换,又可以形成两种排列,当指针指向第三个元素c的时候,这个时候其后没有元素了,此时,则确定了一组排列,输出。但是每次输出后要把数组恢复为原来的样子。
简单来说,它的思想即为,确定第1位,对n-1位进行全排列,确定第二位,对n-2位进行全排列。。。显然,这是一种递归的思想。
def permutations(arr, position, end):
if position == end:
print(arr)
else:
for index in range(position, end):
arr[index], arr[position] = arr[position], arr[index]
permutations(arr, position+1, end)
arr[index], arr[position] = arr[position], arr[index]
arr = ["a","b","c"]
permutations(arr, 0, len(arr))
深度搜索,返回时回溯
visit = [True, True, True]
temp = ["" for x in range(0, 3)]
def dfs(position):
if position == len(arr):
print(temp)
return
for index in range(0,len(arr)):
if visit[index] == True:
temp[position] = arr[index]
visit[index] = False
dfs(position + 1)
visit[index] = True
arr = ["a","b","c"]
dfs(0)
更多算法干货知识分享,请关注微信公众号“IT界的泥石流”,谢谢支持,让我们一起学习算法,体会编程之美吧!