/**
* 全排列: 從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+"個組合");
}
}
java 全排列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.