求一个数组的全排列-Java

啥是全排列勒?

此部分来自百度百科

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

心路历程

按照数学中排列组合的概念,怎样进行全排列呢?

假设有一个数组String[]{“洞庭湖”, “鄱阳湖”, “太湖”, “洪泽湖”}

现在需要放到一个新的四个元素的数组 Array[4],可以按照下面的步骤:

  • 先去在Array[0]处放置,我们有四种选择;
  • 再去Array[1]处放置,我们有三种选择;
  • 再去Array[2]处放置,我们有两种选择;
  • 再去Array[3]处放置,我们有一种选择;

转化成程序语言呢?

  • 对于Array[0]有四种选择,所以我们要用一个 for 循环把四种选择都列出来;
  • 当Array[0]做完一种选择(一次 for 循环)后,Array[1] 就剩下三个元素可以选择了,我们继续用 for 循环把三种选择都列出来;
  • 当Array[1]做完一种选择(一次 for 循环)后,Array[2] 就剩下两个元素可以选择了,我们继续用 for 循环把两种选择都列出来;
  • 当Array[2]做完一种选择(一次 for 循环)后,Array[3] 就剩下一个元素可以选择了,我们继续用 for 循环把一种选择都列出来;

有没有感觉上面像是粘贴复制的效果,请记住这种感觉,当出现这种感觉的时候,我们就可以递归解决问题了。

代码示例

递归是核心,代码有注释,走起:

public class FourLakes {
    
    

    public static void main(String[] args) throws InterruptedException {
    
    
        //待放置元素的数组
        String[] out = new String[4];
        //待计算排列组合的数组
        String[] lakes = new String[]{
    
    "洞庭湖", "鄱阳湖", "太湖", "洪泽湖"};
        //放置元素的索引从0开始
        calc(out, 0, lakes);
    }

    /**
     * 你可能惊讶于代码如此简洁
     * 本宝宝花费了一下午的时间想出来的
     * 会不会笨了点。。。。。。。。。
     * @param out 待放置元素的数组
     * @param outIndex 当前要放置元素的位置
     * @param data 待拿取元素的数组
     */
    private static void calc(String[] out, int outIndex, String[] data) {
    
    
        //递归退出的条件
        //当放置元素的索引大于放置数组长度后,退出
        if (outIndex >= out.length) {
    
    
            System.out.println(Arrays.toString(out));
            return;
        }
        //声明一个缓存数组用,
        //作用是:当从 data 中取完元素后,将剩余元素copy 到其中,因为已经取出了一个元素,所以缓存数组大小要-1
        String[] temp = new String[data.length-1];

        //此处循环的意思就是,data 数组有几个元素就有几种取法
        for (int i = 0; i < data.length; i++) {
    
    
            //取元素,放置到指定的位置
            out[outIndex] = data[i];
            //从取元素的位置向前看,看看是不是有剩余的元素,然后拷贝到缓存数组中
            System.arraycopy(data, 0, temp, 0, i);

            //从取元素的位置向后看,看看是不是有剩余的元素,然后拷贝到缓存数组中
            System.arraycopy(data, i + 1, temp, i, temp.length - i);

            //放置数组不变,将要元素的放置位置+1,将缓存数组作为新的 data
            //递归执行
            calc(out, outIndex + 1, temp);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lijie2664989/article/details/107037475