思路
1.将第一个元素和第i个元素交换,然后求剩余n-1个元素的全排列
2.还原交换的数据,再求下一轮全排列
代码
public class Test3 {
public static int count = 0;
public static void main(String [] args){
Test3.rank();
System.out.println("总共有"+count+"次排列");
}
public static void rank(){
char[] letterArray = {'a','b','c','d','e'};
for(int c1=0;c1<5;c1++){ //0 - 4
swap(letterArray,0,c1);
for(int c2=1;c2<5;c2++){ //0 - 3
swap(letterArray,1,c2);
for(int c3=2;c3<5;c3++){ //0 - 2
swap(letterArray,2,c3);
for(int c4=3;c4<5;c4++){ // 0 - 1
swap(letterArray,3,c4);
for(int c5=4;c5<5;c5++){
print(letterArray);
Test3.count++;
}
swap(letterArray,c4,3);
}
print(letterArray);
swap(letterArray,c3,2);
}
swap(letterArray,c2,1);
}
swap(letterArray,c1,0);
}
}
public static void swap(char[] letterArray,int first,int second){
if(first == second){
return;
}
char middel = 'z';
middel = letterArray[first];
letterArray[first] = letterArray[second];
letterArray[second]=middel;
}
public static void print(char[] letterArray){
StringBuilder sb = new StringBuilder();
sb.append("第"+count+"次排列是:");
for(int i=0;i<letterArray.length;i++){
if(i==letterArray.length-1){
sb.append(letterArray[i]);
}else{
sb.append(letterArray[i]).append(",");
}
}
System.out.println(sb.toString());
}
}
改进点
- 五层for循环是不合理的,超过3就应当考虑使用循环
- 数组生成可以优化
改进后的代码
import java.util.Scanner;
public class Test3 {
public static int count = 0;
public static void main(String [] args){
//确定要对多少个字母列举全排列
Scanner scanner = new Scanner(System.in);
System.out.println("从a开始,要做多少个字母的全排列?");
int amount = scanner.nextInt();
//给将这些字母放在数组里面
char[] letterArray = new char[amount];
for(int i=0;i<amount;i++){
letterArray[i]=(char)('a'+i);
}
//进行全排列计算
Test3.order(letterArray,0,amount);
System.out.println("总共有"+count+"次排列");
}
/**
* 递归调用
* @param letterArray
* @param num
* @param amount
*/
public static void order(char[] letterArray,int num,int amount){
if(num == amount-1){
print(letterArray);
Test3.count++;
}else{
for(int i=num;i<amount;i++){
swap(letterArray,num,i);
order(letterArray,num+1,amount);
swap(letterArray,i,num);
}
}
}
/**
* 交换方法
* @param letterArray
* @param first
* @param second
*/
public static void swap(char[] letterArray,int first,int second){
if(first == second){
return;
}
char middel = 'z';
middel = letterArray[first];
letterArray[first] = letterArray[second];
letterArray[second]=middel;
}
/**
* 打印方法
* @param letterArray
*/
public static void print(char[] letterArray){
StringBuilder sb = new StringBuilder();
sb.append("第"+count+"次排列是:");
for(int i=0;i<letterArray.length;i++){
if(i==letterArray.length-1){
sb.append(letterArray[i]);
}else{
sb.append(letterArray[i]).append(",");
}
}
System.out.println(sb.toString());
}
}
结果:
Paste_Image.png
Paste_Image.png
网友评论