排列組合(Java隨筆)—全排列
阿新 • • 發佈:2018-12-19
全排列:從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、