用C++递归法来实现全排列,有算法分析
时间: 2024-05-11 21:18:00 浏览: 113
递归实现全排列
全排列(Permutation)是指将一组数按一定顺序进行排列,如果这组数有 n 个,那么全排列总共有 n! 种情况。例如,{1,2,3} 的全排列为:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
递归法是一种比较简单的实现全排列的方法,其基本思路是将原问题拆解为更小的子问题,然后逐步求解,直到最终问题被解决。具体实现如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
void permute(vector<int>& nums, int start, vector<vector<int>>& result) {
if (start == nums.size()) {
result.push_back(nums);
return;
}
for (int i = start; i < nums.size(); i++) {
swap(nums[start], nums[i]);
permute(nums, start + 1, result);
swap(nums[start], nums[i]);
}
}
int main() {
vector<int> nums = {1, 2, 3}; // 待排列的数组
vector<vector<int>> result; // 存储全排列结果的二维数组
permute(nums, 0, result);
for (int i = 0; i < result.size(); i++) {
for (int j = 0; j < result[i].size(); j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
在上述代码中,permute 函数的参数包括待排列的数组 nums、当前要处理的数字的下标 start,以及存储结果的二维数组 result。当 start 等于 nums 的长度时,说明当前排列已经完成,将其存入结果数组中。否则,从 start 开始遍历 nums,依次将每个数字交换到 start 位置,然后递归处理 start+1 到 nums 末尾的元素,最后再将数字交换回原位置,继续遍历下一个数字。
算法分析:
时间复杂度:由于全排列的总数为 n!,因此时间复杂度为 O(n!)。
空间复杂度:递归栈的深度为 n,因此空间复杂度为 O(n)。
综上所述,递归法虽然实现简单,但是由于时间复杂度较高,在处理大规模数据时会遇到性能瓶颈。
阅读全文