1. 程式人生 > >排列組合(Java隨筆)—全排列

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