递归,非递归生成数组的所有排列
2015-01-22 18:36
183 查看
#include <iostream> #include <utility> #include <stack> using namespace std; void showArr(int* arr, int len) { for(int i = 0; i < len; ++i) { cout << arr[i] << '\t'; } cout << endl; } // 递归显示组合 void recursiveComb(int arr[], int len, int start) { // 无效参数 if(arr == NULL || len <= 0 || start >= len) { return; } if(start == len - 1) { showArr(arr, len); return; } for(int i = start; i < len; ++i) { if(start != i) { swap(arr[start], arr[i]); } recursiveComb(arr, len, start + 1); swap(arr[start], arr[i]); } } // 非递归显示组合 void nonRecursiveComb(int arr[], int len) { // 无效参数 if(arr == NULL || len <= 0) { return; } stack<int> s; // 栈中第i个元素的值为ai,表示将数组中的第i个元素与第ai个元素交换 s.push(0); while(!s.empty()) { while(s.size() != len) { s.push(s.size()); } while(!s.empty() && s.top() == len - 1) { // 最后一个元素 if(s.size() == len) { showArr(arr, len); } // 换回原来的元素值 swap(arr[s.size() - 1], arr[s.top()]); s.pop(); } if(!s.empty()) { // 换回原来的元素值 swap(arr[s.size() - 1], arr[s.top()]); s.top()++; // 换取下一个元素值 swap(arr[s.size() - 1], arr[s.top()]); } } } int main(int argc, char* argv[]) { int arr[] = {1, 2, 3}; cout << "recursive:" << endl; recursiveComb(arr, sizeof(arr) / sizeof(int), 0); cout << "nonrecursive:" << endl; nonRecursiveComb(arr, sizeof(arr) / sizeof(int)); return 0; }
输出结果:
recursive:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
nonrecursive:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
相关文章推荐
- 递归生成n个元素的所有排列方式
- 递归输出char数组的所有排列
- 基本算法:生成元素数组的所有排列(permute)
- 非递归生成所有排列(knuth)
- 输出数组的所有元素的排列组合(递归)
- 递归实现打印一个数组的所有排列
- 使用递归的方法生成一个序列的所有排列
- 传入一个数组,输出这个数组里面的所有排列
- 判断整型数组a[N]是不是升序排列(递归)
- 枚举数组中所有可能排列的代码实现 [2004年7月8日 1:5
- 数组中的数据随机排列的生成代码及方法
- 从数组中取出n个元素的所有组合(递归实现)
- 递归列举从数组b()中选出某些元素(允许重复)使其和等于num的所有组合
- 采用递归方式输出N个不同元素所有排列方式
- 递归的应用,输出字符串的所有排列(java)
- 使用递归计算数组的排列
- 从数组中取出n个元素的所有组合(递归实现)
- kingcms改进之递归多级子栏目一键生成所有文章(转载未验证)
- PHP递归打印数组中所有元素
- 递归学习_组合_生成全子集组合排列(不含空集)