• C++
  • C++全排列函数 通俗易懂 0基础

  • @ 2025-4-10 21:20:29

在 C++ 中,我们可以使用标准库提供的 next_permutation 函数来生成一个序列的全排列。下面为你详细介绍该函数的使用方法,并给出带有详细注释的代码示例。

代码示例

代码解释

  1. 头文件包含

    • #include <iostream>:用于输入输出操作,比如使用 std::cout 输出信息。
    • #include <algorithm>:包含了 std::sortstd::next_permutation 等算法函数。
    • #include <vector>:用于使用 std::vector 容器来存储需要生成全排列的元素。
  2. std::vector 定义

    • std::vector<int> numbers = {1, 2, 3};:定义了一个存储整数的向量 numbers,并初始化为 {1, 2, 3}。你可以根据需要修改这个向量的元素。
  3. 排序操作

    • std::sort(numbers.begin(), numbers.end());:对向量 numbers 进行排序,确保从字典序最小的排列开始生成全排列。
  4. 全排列生成

    • 使用 do-while 循环结合 std::next_permutation 函数生成全排列。std::next_permutation 函数会将向量 numbers 重新排列为下一个字典序排列,如果存在下一个排列则返回 true,否则返回 false
  5. 输出排列

    • 在循环体中,使用范围 for 循环遍历向量 numbers 中的每个元素,并将其输出。每次输出完一个排列后,使用 std::cout << std::endl; 换行。

复杂度分析

  • 时间复杂度:生成全排列的时间复杂度是 O(n!)O(n!),因为一个包含 nn 个元素的序列的全排列数量为 n!n!
  • 空间复杂度:主要是存储序列的向量的空间,为 O(n)O(n),其中 nn 是序列的长度。

通过上述代码和解释,你可以轻松地使用 C++ 生成一个序列的全排列。你可以修改 numbers 向量中的元素,来生成不同序列的全排列。

1 条评论

  • @ 2025-4-10 21:20:58
    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    int main() {
        // 定义一个整数向量,用于存储需要生成全排列的元素
        std::vector<int> numbers = {1, 2, 3};
    
        // 对向量进行排序,确保从字典序最小的排列开始
        // 因为 next_permutation 函数是按字典序依次生成下一个排列的
        // 如果不排序,可能无法生成完整的全排列
        std::sort(numbers.begin(), numbers.end());
    
        // 输出提示信息,表明开始生成全排列
        std::cout << "该序列的全排列如下:" << std::endl;
    
        // 使用 do-while 循环生成并输出所有排列
        // 先执行一次循环体,输出当前的排列
        // 然后调用 next_permutation 函数尝试生成下一个排列
        // 如果存在下一个排列,next_permutation 函数会返回 true,继续循环
        // 如果不存在下一个排列,函数返回 false,循环结束
        do {
            // 遍历向量中的每个元素
            for (int num : numbers) {
                // 输出当前元素
                std::cout << num << " ";
            }
            // 换行,使每个排列单独占一行
            std::cout << std::endl;
        } while (std::next_permutation(numbers.begin(), numbers.end()));
    
        return 0;
    }    
    
    • 1