排列组合(Java随笔)—全排列

全排列:从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 arrayList=new ArrayList();//初始数据
		arrayList.add(2);
		arrayList.add(4);
		arrayList.add(9);
		arrayList.add(0);
		StringBuffer data=new StringBuffer();//追加待组合的数据
		ArrayList results=new ArrayList();//保存排列好的数据
		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 arrayList, StringBuffer data, ArrayList results) {
		if(arrayList.size()==0) {
			results.add(data.toString());
		}
		for(int i=0;i newarrayList=new ArrayList(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、

 

你可能感兴趣的:(经典算法)