java 全排列
[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+"个组合");
}
}
补充:软件开发 , Java ,