排列

作者: 四喜汤圆 | 来源:发表于2018-05-02 20:19 被阅读1次
/**
 * 
* <p>Description: 
* 1,求全排列的非递归、递归方法
* 2,从n个数中取m个数的所有排列形式
* </p>  
* @author 杨丽金  
* @date 2018-5-2  
* @version 1.0
 */
public class 排列 {
    private static int count_fullPermutation1=0;
    private static int count_fullPermutation2=0;
    private static int count_Permutation=0;
    public static void main(String[] args) {
        int[] data={1,2,3,4};
        // 输出全组合的排列形式
        f1(data);
        
        // 输出从n个元素中取m个出来的排列形式
        f2(data,2);
    }

    

    /**
     * 输出数组data中的数的全排列
     * @param data
     */
    private static void f1(int[] data) {

        System.out.println("*******全排列输出*******");
        fullPermutation(data);
        System.out.println("count_fullPermutation1="+count_fullPermutation1);
        fullPermutation2(data,0);
        System.out.println("count_fullPermutation2="+count_fullPermutation2);
    }

    
    /**
     * 1,在数组长度已知的情况下用循环嵌套方法
     * 缺点:不能动态扩展,没有普适性
     * 【非递归解法】
     * @param data
     */
    private static void fullPermutation(int[] data) {
        // 例如数组长度为4
        // 保存某位上的数字是否已被使用
        boolean[] flag=new boolean[data.length];
        // 1,
        for(int i=0;i<data.length;i++){
            flag[i]=true;
            // 2,
            for(int j=0;j<data.length;j++){
                if(flag[j]){
                    continue;
                }
                flag[j]=true;
                // 3,
                for(int k=0;k<data.length;k++){
                    if(flag[k]){
                        continue;
                    }
                    flag[k]=true;
                    // 4,
                    for(int t=0;t<data.length;t++){
                        if(flag[t]){
                            continue;
                        }
                        flag[t]=true;
                        count_fullPermutation1++;
                        System.out.println(String.format("%s %s %s %s",data[i],data[j],data[k],data[t]));
                        flag[t]=false;// 在该种选择下得到了结果后,回溯
                    }
                    flag[k]=false;// 回溯
                }
                flag[j]=false;
            }
            flag[i]=false;
        }
    }
    
    /**
     * 所以用递归的方式进行求解
     * 这样的递归是不行的,会陷入死循环
     * @param data
     */
    /*private static void fullPermutation2(int[] data){
    }*/
    
    /**
     * 递归思路是:先选定一个数,然后对其后面的数再进行全排列
     * 【非递归解法】
     * @param data
     * @param k:当前关注的位置
     */
    private static void fullPermutation2(int[] data,int k){
        if(k==data.length){
            //
            count_fullPermutation2++;
            for(int i=0;i<data.length;i++){
                System.out.print(data[i]+" ");
            }
            System.out.println();
            return;
        }
        for(int i=k;i<data.length;i++){
            swap(data,i,k);
            fullPermutation2(data,k+1);
            swap(data,i,k);
        }
    }
    
    private static void swap(int[] data, int i, int k) {
        int temp=data[i];
        data[i]=data[k];
        data[k]=temp;
    }


    /**
     * 从数组data中取m个数的各种排列形式输出
     * @param data
     * @param m
     */
    private static void f2(int[] data,int m) {
        System.out.println("*******从数组中取m个出来的各种排列形式*******");
        permutation(data,m,0);
        System.out.println("count_Permutation="+count_Permutation);
        permutation2(data);
    }
    
    /**
     * 从数组data中取m个数的各种排列形式输出
     * 【递归解法】
     * @param data
     * @param m
     * @param k:当前需要关注的位置
     */
    private static void permutation(int[] data, int m,int k){
        if(k==m){
            count_Permutation++;
            for(int i=0;i<m;i++){
                System.out.print(data[i]+" ");
            }
            System.out.println();
            return;
        }
        for(int i=k;i<data.length;i++){
            swap(data,k,i);
            permutation(data,m,k+1);
            swap(data,k,i);
        }
    }
    
    /**
     * 从数组data中取m个数的各种排列形式输出
     * 【非递归解法】
     * @param data
     * @param m
     */
    private static void permutation2(int[] data){
        for(int i=0;i<data.length;i++){
            swap(data,0,i);
            for(int j=1;j<data.length;j++){
                System.out.println(data[0]+" "+data[j]);
            }
            swap(data,0,i);
        }
    }
}


上述代码中列出了

  • 全排列的非递归、递归解法
  • 从n个数中取m个的各种排列形式输出

相关文章

  • 排列类算法问题大总结

    全排列 带重复元素的排列 下一个排列 上一个排列 第 k 个排列 排列序号 排列序号II 全排列 给定一个数字列表...

  • 排列组合——排列

    学习概率论与数理统计,要用到排列组合的知识,更重要的是要用到排列组合的思维方法,因此,学习概率与统计是很有必要了解...

  • 时间长了就生疏的排列组合

    排列数:组合数:全排列:排列是先组合再排列: 最基本的排列组合公式,不能忘在脑后,应该熟稔于心。 排列和组合的区...

  • 排列

    窗前的人打开电脑,戴上耳机,打开台灯,关上了房间的灯光。 屋内冷气的声音慢慢隐去了,他不经意间看见一张报纸。报纸上...

  • 排列

    Next Permutation Implement next permutation, which rearra...

  • 排列

    主副:千日红 副:油菜花 中间枝:小菊花,高山羊齿 剑山的摆放中间的位置可以依靠任意一边近一些 副枝和另外两个副助...

  • 排列

    上述代码中列出了 全排列的非递归、递归解法 从n个数中取m个的各种排列形式输出

  • 排列

    排列 a,b,c的排列形式有abc,acb,bac,bca,cab,cba,六种排列方式。 采用递归的方法来实现排...

  • 排列

  • 排列

    用小积木摆成一形状: 数学棒: 整体示意图:

网友评论

      本文标题:排列

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