1.全排列的定义和公式:
从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。由排列的定义,显然不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。从n个元素取出n个元素的一个排列,称为一个全排列。全排列的排列数公式为n!,通过乘法原理可以得到。
2.时间复杂度:
n个数(字符、对象)的全排列一共有n!种,所以全排列算法至少时间O(n!)
的。如果要对全排列进行输出,那么输出的时间要O(n∗n!),因为每一个排列都有n个数据。
算法思路:全排列可以看做固定前i位,对第i+1位之后的再进行全排列,比如固定第一位,后面跟着n-1位的全排列。那么解决n-1位元素的全排列就能解决n位元素的全排列了,这样的设计适合用递归实现。
举例:简单点拿常数1,2,3来说:首先对1进行全排列,首先保持第一个不变,对【2,3】进行全排列。同样地,我们先保持2不变,对【3】进行全排列。故排列为【1,2,3】 。接下来不能以2打头了,2,3相互交换,得到
【1,3,2】。 所以1的全排列为【1,2,3】,【1,3,2】 。同理对2,3元素同样处理。
递归代码:
void prim(int a[],int start,int end){
if(start&