有1~n的n个整数,现要求打印出这n个数的所有可能的排列。比如 1 、2、3的全排列:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
我在网上找到了一个用递归求全排列的例子,稍微改了一下,现在贴出来,因为感觉这个例子挺有用的:
import java.util.ArrayList;
import java.util.List;
public class PaiLie {
/**
* @param args
*/
public static void main(String[] args) {
List s=new ArrayList();
List rs=new ArrayList();
for(int i=1;i<=3;i++)
s.add(i);
pl(s,rs);
}
public static void pl(List s,List rs){
if(s.size()==1)
{
rs.add(s.get(0));
System.out.println(rs.toString());
rs.remove(rs.size()-1);
}else{
for(int i=0;i
rs.add(s.get(i));
List tmp=new ArrayList();
for(Integer a:s)
tmp.add(a);
tmp.remove(i);
pl(tmp,rs);
rs.remove(rs.size()-1);
}
}
}
}
2015-03-15 附上另一种思路的全排列算法:
package com.test.pl;
import java.util.LinkedList;
import java.util.List;
public class Qpl {
public static void main(String[] args) {
// TODO 自动生成的方法存根
List data = new LinkedList();
data.add("1");
data.add("2");
data.add("3");
data.add("4");
List> result = pl(data);
for(int i=0;i
System.out.println(result.get(i));
}
}
/**
* 得到全排列的方法
* @param data 存放要排列的各个元素
* @return List> 结果中的每一个List就是一种可能的排列
*/
public static List> pl(List data){
if(data.size()==1){
// 如果data中只有一个元素,那么直接得到它的全排列
List> result= new LinkedList>();
List p = new LinkedList<>();
p.add(data.get(0));
result.add(p);
return result;
}else{
// 否则,去除第一个元素,然后得到剩下的 n-1 个元素的全排列,第一个元素插入到每一种排列中的相应位置上就可以得到所有元素的全排列了
// 也就是说, n-1 个元素的全排列中的每一种排列又可以衍生出 n 种排列
String first = data.get(0);
List remainList = data.subList(1, data.size());
List> remainPl = pl(remainList);
List> result= new LinkedList>();
for(int i=0;i
List thisOne = remainPl.get(i);
for(int j=0;j<=thisOne.size();j++){
List copyOne = new LinkedList<>(thisOne);
copyOne.add(j,first);
result.add(copyOne);
}
}
return result;
}
}
}