c++全排列
时间: 2025-05-15 13:05:58 浏览: 16
C++ 中可以利用标准库中的函数 `std::next_permutation` 和 `std::prev_permutation` 来生成全排列。这两个函数可以在给定范围内的元素上依次生成下一个或前一个字典序排列。
例如,假设我们有一个数组 `{1, 2, 3}`,我们可以使用以下步骤获取它的所有排列:
```cpp
#include <iostream>
#include <algorithm> // 包含 next_permutation 函数
int main() {
int arr[] = {1, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
std::sort(arr, arr + n); // 确保从最小的字典序开始
do {
for (int i = 0; i < n; ++i)
std::cout << arr[i] << " ";
std::cout << std::endl;
} while (std::next_permutation(arr, arr + n)); // 循环直到没有更多的排列
return 0;
}
```
上述程序将打印出所有的排列组合:
1. 1 2 3
2. 1 3 2
3. 2 1 3
4. 2 3 1
5. 3 1 2
6. 3 2 1
### 工作原理:
- **`std::sort()`** 首先对序列排序以保证初始状态是最小字典序。
- 使用循环配合 `do...while` 结构不断调用 `std::next_permutation` 直到无法再生成新的排列为止。
#### 手动递归实现
如果你不想依赖 STL 提供的功能,还可以通过手动编写递归来解决这个问题:
```cpp
void permute(std::vector<int>& nums, int start, int end, std::vector<std::vector<int>>& result) {
if (start == end) {
result.push_back(nums);
return;
}
for (int i = start; i <= end; ++i) {
std::swap(nums[start], nums[i]); // 交换位置
permute(nums, start+1, end, result); // 对剩下的部分继续处理
std::swap(nums[start], nums[i]); // 恢复原样以便下次迭代正确工作
}
}
// 调用例子
int main(){
std::vector<int> nums = {1, 2, 3};
std::vector<std::vector<int>> res;
permute(nums, 0, nums.size()-1, res);
for(auto vec : res){
for(int num : vec)
cout << num << ' ';
cout << endl;
}
return 0;
}
```
以上代码会生成并存储所有可能的排列,并最终输出它们。
阅读全文
相关推荐



















