算法-----全排列

简介: 算法-----全排列



前言

全排列是一种组合数学的概念,它表示将一组元素按照一定顺序进行排列的所有可能情况。在计算机编程中,通常使用递归来实现全排列。以下是使用Java语言实现全排列的详细解释:

代码

public class Permutation {
    // 交换数组中两个元素的位置
    private static void swap(char[] array, int i, int j) {
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    // 递归生成全排列
    private static void generatePermutations(char[] array, int start, int end) {
        if (start == end) {
            // 当start等于end时,表示已经到达数组的末尾,此时输出当前排列
            System.out.println(new String(array));
        } else {
            // 对当前位置的元素和后面的元素进行交换,并递归调用生成全排列
            for (int i = start; i <= end; i++) {
                swap(array, start, i);
                generatePermutations(array, start + 1, end);
                // 恢复交换,确保下一次循环时数组的顺序是原始的
                swap(array, start, i);
            }
        }
    }
    // 生成全排列的入口函数
    public static void generatePermutations(String input) {
        if (input == null || input.length() == 0) {
            System.out.println("输入字符串为空!");
            return;
        }
        char[] array = input.toCharArray();
        generatePermutations(array, 0, array.length - 1);
    }
    public static void main(String[] args) {
        String input = "abc";
        generatePermutations(input);
    }
}

思路

这段代码包含了两个重要的函数:swapgeneratePermutations。其中:

  • swap:用于交换数组中两个位置的元素,这是生成全排列的关键之一。
  • generatePermutations:是递归函数,它在数组中选取一个元素,然后递归调用自身生成剩余元素的全排列。这个过程中,通过不断交换元素的位置来实现不同的排列组合。

main 函数中,你可以通过调用 generatePermutations 函数并传入待排列的字符串来生成全排列。在示例中,输入字符串是 "abc"。运行程序后,你将看到所有可能的排列组合输出在控制台上。

每段代码详细讲解

public class Permutation {

   // 交换数组中两个元素的位置

   private static void swap(char[] array, int i, int j) {

       char temp = array[i];

       array[i] = array[j];

       array[j] = temp;

   }

 

上面的 swap 方法用于交换数组中两个元素的位置。这是生成全排列的关键,因为在生成排列时,我们会不断交换元素的位置,以获得不同的排列组合。

   // 递归生成全排列

   private static void generatePermutations(char[] array, int start, int end) {

       if (start == end) {

           // 当start等于end时,表示已经到达数组的末尾,此时输出当前排列

           System.out.println(new String(array));

       } else {

           // 对当前位置的元素和后面的元素进行交换,并递归调用生成全排列

           for (int i = start; i <= end; i++) {

               swap(array, start, i);

               generatePermutations(array, start + 1, end);

               // 恢复交换,确保下一次循环时数组的顺序是原始的

               swap(array, start, i);

           }

       }

   }

 

generatePermutations 方法是递归生成全排列的核心部分。它接受三个参数:

  • array:代表待排列的数组。
  • start:当前要排列的起始位置。
  • end:当前要排列的结束位置。

在方法内部,首先检查是否已经到达了数组的末尾,即 start == end。如果是,表示当前排列已经完成,可以输出。否则,通过一个循环遍历当前位置及其后面的元素,不断交换元素的位置,并递归调用 generatePermutations 生成剩余元素的全排列。为了确保下一次循环时数组的顺序是原始的,需要在递归调用之后恢复交换。

   // 生成全排列的入口函数

   public static void generatePermutations(String input) {

       if (input == null || input.length() == 0) {

           System.out.println("输入字符串为空!");

           return;

       }

       char[] array = input.toCharArray();

       generatePermutations(array, 0, array.length - 1);

   }

 

 

generatePermutations 方法是生成全排列的入口函数。它接受一个字符串作为输入,将字符串转换为字符数组,并调用 generatePermutations 方法开始生成全排列。

   public static void main(String[] args) {

       String input = "abc";

       generatePermutations(input);

   }

 

main 方法中,你可以调用 generatePermutations 并传入你想要排列的字符串。在这个示例中,输入字符串是 "abc"。运行程序后,你将看到所有可能的排列组合输出在控制台上。

总体而言,这个算法使用递归和数组元素交换的方式,从头到尾地生成了所有可能的排列。通过不断改变元素的位置,它覆盖了所有可能的排列情况。

 


相关文章
|
2月前
|
算法 C++ 索引
【算法】——全排列算法讲解
【算法】——全排列算法讲解
|
5月前
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
49 0
|
6月前
|
算法
代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II
代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II
39 0
|
9月前
|
机器学习/深度学习 存储 算法
算法训练Day29|* 491.递增子序列* 46.全排列* 47.全排列 II
算法训练Day29|* 491.递增子序列* 46.全排列* 47.全排列 II
|
11月前
|
自然语言处理 算法
经典算法之——解决全排列问题以及详解
经典算法之——解决全排列问题以及详解
183 0
|
11月前
|
机器学习/深度学习 算法 Python
Python|“套娃”算法-递归算法解决全排列
Python|“套娃”算法-递归算法解决全排列
93 0
|
12月前
|
算法
回溯算法 全排列模板
回溯算法 全排列模板
53 0
|
12月前
|
算法 C++ 容器
C++ vector 容器的全排列算法 next_permutation
C++ vector 容器的全排列算法 next_permutation
123 0
|
12月前
|
算法 前端开发 iOS开发
前端电商 sku 的全排列算法很难吗?学会这个套路,彻底掌握排列组合
前段时间在掘金看到一个热帖 《今天又懒得加班了,能写出这两个算法吗?带你去电商公司写商品中心》,里面提到了一个比较有意思故事,大意就是一个看似比较简单的电商 sku 的全排列组合算法,但是却有好多人没能顺利写出来。有一个毕业生小伙子在面试的时候给出了思路,但是进去以后还是没写出来,羞愧跑路~
|
算法 C语言
全排列算法(C语言)
我看先看一下从1–4的全排列,如下
132 0
全排列算法(C语言)