abcde全排列及改进

2017-02-10  本文已影响78人  尘瀚

思路

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());
}
}

改进点

  1. 五层for循环是不合理的,超过3就应当考虑使用循环
  2. 数组生成可以优化

改进后的代码

        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
上一篇下一篇

猜你喜欢

热点阅读