1. 程式人生 > >給定一個數組,求出陣列元素的排列和組合——Java實現

給定一個數組,求出陣列元素的排列和組合——Java實現

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;
		}
	}
	
}