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+"個組合");
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章