排列组合(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<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、

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值