算法设计与分析 王晓东 感谢老师
Perm(list,k,m)
1.当k == m,即元素已经全排列,那么输出打印即可。
2当k+1 = m ,那么此时只有两个元素,输出两种排列情况:原数列,交换后的数列。
3.当k+2 = m,那么此时有三个元素。设顺序确定为x1、x2、x3.
1) X1不变,对剩下的两个元素全排列,如2
2) 交换x1、x2,对剩下的两个元素全排列,如2
3)交换x1,x3,对剩下的两个元素全排列,如2
4.当k+3 = m,那么此时有四个元素。设顺序确定为x1、x2、x3、x4
1) X1不变,对剩下的三个元素全排列,如3
2) 交换x1、x2,对剩下的三个元素全排列,如3
3)交换x1、x3,对剩下的三个元素全排列,如3
4) 交换x1、x4,对剩下的三个元素全排列,如3
以此类推,直到k==m。递归调用结束。
用图表示如下;
package com.wjl;
public class Perm
{
static int count = 0;
public void perm(int[] list, int k, int m)
{
if(k == m)
{
for(int i= 0; i<= m; i++)
{
System.out.println(list[i]);
}
System.out.println("排列数:"+(++count));
}
else
for(int i = k; i<= m; i++)
{
System.out.println("before "+list[k]+" "+list[m]);
MyMath.swap(list, k, i);
System.out.println("after "+list[k]+" "+list[m]);
perm(list,k+1,m);
MyMath.swap(list, k,i);
}
}
public static void main(String[] args)
{
int[] list = new int[]{1,2,3,4};
Perm p = new Perm();
p.perm(list,0,3);
}
}