美文网首页
abcde全排列及改进

abcde全排列及改进

作者: 尘瀚 | 来源:发表于2017-02-10 00:00 被阅读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

    相关文章

      网友评论

          本文标题:abcde全排列及改进

          本文链接:https://www.haomeiwen.com/subject/maowittx.html