最近写了很多算法题,遇到了很多关于全排列的问题。在这里我单独讲解一下全排列问题。
1、什么是全排列?
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。用符号p(n,m)表示.
p(n,m)=n(n- 1)(n-2.....-m.+1)= n!/(n-m)!(规定 0!=1).
当m=n时所有的排列情况叫全排列。
2、通过一个实例来理解一下吧
对数组a={1,2,3,4}进行全排列,输出所有排列情况。
public class test {
static int[] a={1,2,3,4};
static int count=0;
public static void main(String[] args){
f(0);//进入递归
System.out.println("count="+count);//输出全排列个数
}
public static void f(int k){
if(k==4){//递归返回条件
for (int i=0;i<4;i++)
System.out.printf("%d",a[i]);//输出一次排列结果
count++;//计数
System.out.println();
}
for(int i=k;i<4;i++)//递归
{
swap(i,k);
System.out.printf("before i=%d,k=%d\n",i,k);//可注释掉。用来方便大家理解用的
f(k+1);
System.out.printf("after i=%d,k=%d\n",i,k);//可注释掉
swap(i,k);
}
}
public static void swap(int i,int k){//交换函数
int t=a[i];
a[i]=a[k];
a[k]=t;
}
}
在注释掉中间两行的代码后的输出结果:
1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123
count=24
答案是24,符合数学计算:4!=4*3*2*!=24
结合这几张图再配上后面这段注解代码带大家理解全排列
不注释时输出结果:
before i=0,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
1234
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
1243
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
1324
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
1342
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
1432
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
1423
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=0,k=0
before i=1,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
2134
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
2143
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
2314
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
2341
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
2431
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
2413
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=1,k=0
before i=2,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
3214
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
3241
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
3124
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
3142
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
3412
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
3421
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=2,k=0
before i=3,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
4231
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
4213
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
4321
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
4312
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
4132
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
4123
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=3,k=0
count=24
进程已结束,退出代码0
大家也可以多试几个数值,多理解一下。
这里为大家列出几个全排列的例题,理解过全排列后可以上手试一下这些题。