给定一个数组,求出数组元素的排列和组合——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;
		}
	}
	
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值