java 全排列

/**
 * 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
 * [1,n],[1,n-1],[1,n-2]……[1]
 * 
 */
public class WholeArray {
	//组合数
	private static int totalTime=0;
	/**
	 * m*(m-1)*……*1的实现
	 * @param numbers
	 * @param numbersTemp
	 * @param marks
	 * @param m
	 */
	public static void printWholeArray(String[] numbers, String[] numbersTemp,
			boolean marks[], int m) {		
		for (int j = 0; j < marks.length; j++) {
			if (!marks[j]) {				
				break;
			}
			if(j==marks.length-1 && marks[j]){
				// marks数组里都标志位true了,完成一次全排列,输出一组排列
				//printArray(numbersTemp);
				totalTime++;
				break;
			}
		}
		/*if(m==0){
			return;
		}*/		
		/*boolean flag = false;*/
		for (int j = 0; j < marks.length; j++) {
			if (!marks[j]) {//如果[1,n]或[1,n-1]或[1,n-2]……或[1]中没有使用过的选择
				numbersTemp[numbers.length - m] = numbers[j];
				marks[j] = true;//标志为已用
				
				// 处理剩余的i-1个数的全排列
				printWholeArray(numbers, numbersTemp, marks, m - 1);
				/*flag = false;*/
				marks[j] = false;//标志为未用
			}/*else if(j==marks.length-1 && marks[j] && flag){
				// marks数组里都标志位true了,完成一次全排列,输出一组排列
				printArray(numbersTemp);
				totalTime++;
				break;
			}*/
		}
	}

	/**
	 * 输出数组numbers的全排列
	 * 
	 * @param numbers
	 */
	public static void printWholeArray(String[] numbers) {
		if (numbers == null || numbers.length == 0) {
			return;
		} else {
			
			String numbersTemp[] = new String[numbers.length];// 可变的输出数组
			boolean marks[] = new boolean[numbers.length];// 标记当前元素是否被使用

			for (int i = 0; i < numbers.length; i++) {
				numbersTemp[i] = numbers[i];
				marks[i] = false;
			}
			
			printWholeArray(numbers, numbersTemp, marks, numbers.length);
		}
	}
	/**
	 * 输出全排列
	 * @param numbers
	 */
	public static void printArray(String[] numbers) {
		for (int i = 0; i < numbers.length; i++) {
			System.out.print(numbers[i] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int count = 5;//5*4*3*2*1
		String numbers[] = new String[count];
		for (int i = 0; i < count; i++) {
			numbers[i] = i + 1 + "";
		}

		printWholeArray(numbers);
		
		System.out.println("共有:"+totalTime+"个组合");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值