給定一個數組,求出陣列元素的排列和組合——Java實現
阿新 • • 發佈:2019-01-25
1. 思路
組合數C(n,m)和全排列A(n,n)可以通過遞迴的方式,直接實現。
而A(n,m)則可以通過組合數和全排列間接求出A(n,m)=C(n,m)*A(m,m),即對得到的組合數中的每個元素進行全排列
2. Java實現
package com.zfy.test3; import java.util.*; public class PC { public static void main(String[] args) { char[] str={'A','B','C','D','E'}; ArrayList<Character> t=new ArrayList<Character>(); ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>(); //求組合數 Combination(str,5,3,t,res); System.out.println(res); //求全排列 System.out.println(Permutation(str,5,3)); } //全排列方法1 public static void permulation(int[] list, int start, int length) { int i; if (start == length) { for (i = 0; i < length; i++) System.out.print(list[i] + " "); System.out.println(); } else { for (i = start; i < length; i++) { swap(list, start, i); permulation(list, start + 1, length); swap(list, start, i); } } } public static void swap(int[] list, int start, int i) { int temp; temp = list[start]; list[start] = list[i]; list[i] = temp; } //全排列方法2 public static ArrayList<ArrayList<Character>> Permutation(char[] A,int n) { if(n==1) { ArrayList<Character> t=new ArrayList<Character>(); ArrayList<ArrayList<Character>> temp=new ArrayList<ArrayList<Character>>(); t.add(A[0]); temp.add(t); return temp; } else { ArrayList<ArrayList<Character>> temp=Permutation(A,n-1); ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>(); for(int i=0;i<temp.size();i++) { for(int j=0;j<n;j++) { ArrayList<Character> t=new ArrayList<Character>(temp.get(i)); if(j<n-1) { t.add(j,A[n-1]); res.add(t); } else { t.add(A[n-1]); res.add(t); } } } return res; } } //指定個數元素的排列 public static ArrayList<ArrayList<Character>> Permutation(char[] A,int n,int m) { ArrayList<ArrayList<Character>> temp=new ArrayList<ArrayList<Character>>(); ArrayList<Character> t=new ArrayList<Character>(); Combination(A,n,m,t,temp); ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>(); for(int i=0;i<temp.size();i++) { char[] tc=new char[temp.get(i).size()]; for(int j=0;j<tc.length;j++) { tc[j]=temp.get(i).get(j); } res.addAll(Permutation(tc,tc.length)); } return res; } //組合數,通過引數返回結果 public static void Combination(char[] A,int n,int m,ArrayList<Character> t,ArrayList<ArrayList<Character>> res) { if(m==0) { ArrayList<Character> temp=new ArrayList<Character>(t); res.add(temp); } else { // for(int i=n-1;i>=m-1;i--) // { // t.add(A[i]); // Combination(A,i,m-1,t,res); // t.remove(t.size()-1); // } for(int i=A.length-n;i<=A.length-m;i++) { t.add(A[i]); Combination(A,A.length-i-1,m-1,t,res); t.remove(t.size()-1); } } } //組合數,通過返回值返回結果 public static ArrayList<ArrayList<Character>> Combination(char[] A,int n,int m,ArrayList<Character> t) { ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>(); if(m==0) { ArrayList<Character> temp=new ArrayList<Character>(t); res.add(temp); return res; } else { // for(int i=n-1;i>=m-1;i--) // { // t.add(A[i]); // Combination(A,i,m-1,t,res); // t.remove(t.size()-1); // } for(int i=A.length-n;i<=A.length-m;i++) { t.add(A[i]); res.addAll(Combination(A,A.length-i-1,m-1,t)); t.remove(t.size()-1); } return res; } } }