Java实现排列组合算法

用Java实现排列算法:

package Sort;

import java.util.ArrayList;
import java.util.List;

public class Arrange {
	public static void main(String[] args) {
		Arrange arrange = new Arrange();
		List<Character> data = new ArrayList<Character>();
		data.add('a');
		data.add('b');
		data.add('c');
		data.add('d');
		
		//输出A(n,n)的全排列
		for(int i = 1; i <= data.size(); i++)
			arrange.arrangeSelect(data,new ArrayList<Character>(),i);

	}
	
	/**
	 * 计算A(n,k)
	 * 
	 * @param data
	 * @param target
	 * @param k
	 */
	public <E> void arrangeSelect(List<E> data,List<E> target, int k) {
		List<E> copyData;
		List<E> copyTarget;
		if(target.size() == k) {
			for(E i : target) 
				System.out.print(i);
			System.out.println();
		}
	
		for(int i=0; i<data.size(); i++) {
			copyData = new ArrayList<E>(data);
			copyTarget = new ArrayList<E>(target);
			
			copyTarget.add(copyData.get(i));
			copyData.remove(i);
			
			arrangeSelect(copyData, copyTarget,k);
		}
	}

}
</pre><pre name="code" class="java">Java实现组合算法

package Sort;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * 求在M中找出N的排列数
 * 算法思想:递归
 *  eg:abcd的全排列结果分别为:a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd
 *  可以看出,当求N位的组合数时,可以先固定前N-1位,然后在匹配最后一位可行值;以此类推可用递归的方法求出所有可能的值。
 *   
 * @author YHYR
 *
 */

public class Combine {
	
	public static void main(String[] args) {
		List<Character> data = new ArrayList<Character>();
		data.add('a');
		data.add('b');
		data.add('c');
		data.add('d');
		Combine t = new Combine();
		
		for(int i = 1; i < data.size(); i++)
		t.combinerSelect(data, new ArrayList<Character>(), data.size(), i);
	}
	
	/**
	 * 步骤::每次递归时,把原始数据和满足条件的工作空间复制一份,所有的操作均在复制文件中进行,目的就是保证不破坏原始数据,
	 * 		从而可以让一轮递归结束后可以正常进行下一轮。
	 * 		其次,把数据的第一个元素添加到工作空间中,判断工作空间的大小,如果小于k,则需要继续递归,但此时,传入递归函数的
	 * 		参数需要注意:假设当前插入的节点的下标是i,因为是顺序插入的,所以i之前的所有数据都应该舍去,只传入i之后的未使用过的数据。
	 * 		因此在传参之前,应该对copydata作以处理;当大于k的时候,则表明已经找到满足条件的第一种情况,然后只需修改该情况的最后一个结果即可。
	 * 		如:找到abc时,则只需替换c为d即可完成该轮递归。
	 * 
	 * @param data	原始数据
	 * @param workSpace	自定义一个临时空间,用来存储每次符合条件的值
	 * @param k		C(n,k)中的k
	 */
	public <E> void combinerSelect(List<E> data, List<E> workSpace, int n, int k) {
		List<E> copyData;
		List<E> copyWorkSpace;
		
		if(workSpace.size() == k) {
			for(Object c : workSpace)
				System.out.print(c);
			System.out.println();
		}
		
		for(int i = 0; i < data.size(); i++) {
			copyData = new ArrayList<E>(data);
			copyWorkSpace = new ArrayList<E>(workSpace);
			
			copyWorkSpace.add(copyData.get(i));
			for(int j = i; j >=  0; j--)
				copyData.remove(j);
			combinerSelect(copyData, copyWorkSpace, n, k);
		}
		
	}
	
}


  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸辰杳

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值