全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
公式:全排列数f(n)=n!(定义0!=1)(也可表示为A(n,n)),如1,2,3三个元素的全排列为:123、132、213、231、312、321
代码实现:
import java.util.ArrayList;
public class RankSuanFa {
/*
* 排列组合
* eg:a b c的排列有abc,acb,bac,bca,cab,cba
* 方法:递归,第一层循环把n个数中的第i个装入结果的第一个位置
* 接着将剩下的n-1个数循环装入第二个位置
* 把剩下的n-2个数循环装入第三个位置...
*/
public static void main(String[] args) {
ArrayList<Integer> arrayList=new ArrayList<Integer>();//初始数据
arrayList.add(2);
arrayList.add(4);
arrayList.add(9);
arrayList.add(0);
StringBuffer data=new StringBuffer();//追加待组合的数据
ArrayList<String> results=new ArrayList<String>();//保存排列好的数据
rank(arrayList,data,results);
int k=0;//按合适的格式输出排列结果
for(String s:results) {
k++;
System.out.print(s+"、");
if(k==results.size()/arrayList.size()) {
k=0;
System.out.println();
}
}
}
//主要算法
public static void rank(ArrayList<Integer> arrayList, StringBuffer data, ArrayList<String> results) {
if(arrayList.size()==0) {
results.add(data.toString());
}
for(int i=0;i<arrayList.size();i++) {
data.append(arrayList.get(i));
//必须创建新的list,否则原来的list会被改变
ArrayList<Integer> newarrayList=new ArrayList<Integer>(arrayList);
newarrayList.remove(i);
rank(newarrayList,data,results);
}
//把记录的data最后一个去掉,否则前面的结果会影响循环过程。
if(data.length()!=0) {
data.deleteCharAt(data.length()-1);
}
}
}
运行结果:
2490、2409、2940、2904、2049、2094、
4290、4209、4920、4902、4029、4092、
9240、9204、9420、9402、9024、9042、
0249、0294、0429、0492、0924、0942、