递归,非递归生成数组的所有排列
来源:互联网 发布:js获取a标签的href 编辑:程序博客网 时间:2024/06/09 15:02
#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
0 0
- 递归,非递归生成数组的所有排列
- 非递归生成所有排列(knuth)
- 生成排列的非递归实现算法
- 递归输出char数组的所有排列
- 全排列生成 (递归+非递归)
- 非递归数组全排列
- 全排列的递归与非递归
- 排列的递归和非递归版本
- 使用递归的方法生成一个序列的所有排列
- 排列的非递归实现
- 递归生成n个元素的所有排列方式
- 递归算法生成n个元素的所有排列
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)
- 递归实现打印一个数组的所有排列
- 全排列生成算法(非递归)
- Permutations 排列的生成, 递归
- 比较某排列生成算法的递归版和非递归版的效率
- 全排列 递归,非递归
- IOS8下定位(CLLocationManager) 的改变
- [转]基于大规模语料的新词发现算法
- 1061.Dating
- S3C2440上LCD驱动(FrameBuffer)实例开发讲解(二)
- R语言中同比增长和环比增长
- 递归,非递归生成数组的所有排列
- 签名后友盟自动更新失效解决方法
- iOS--相机(自定义相机) 保存照片到相册
- HDU 3001 Travelling 状态压缩dp+3进制
- 1062.Talent and Virtue
- iOS判断一个字符串中是否都是数字
- ios 申请真机调试( xcode 5)详细解析
- 【Android】系统中几种消息机制的一些开发总结
- Redis中-Sorted-Sets数据类型