递归,非递归生成数组的所有排列

来源:互联网 发布: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
原创粉丝点击