全排列(深度优先搜索非递归实现)
2015-03-20 18:14
204 查看
前段时间面试了一家公司的图像岗位,居然尽问我C++的知识,还让我写全排列,表示无语……,不过还是硬着头皮写了下,这么久没接触算法,之前也没写过全排列,汗颜呀,回来还发现写法有些low,贴出当时的代码,mark下学业不精的尴尬,顺便熟悉一下MarkDown,以后再也不用Word写博客了,
基本思路是DFS,考虑到递归的栈消耗,于是用数组来实现非递归,时间复杂度为N!,上代码:
flag: 是否已经选中的标记,已经选择了为1,否则为0
state: 记录上一次搜索到的数字
data: 存放全排列
题目
输出 1,2,…,N的全排列样例
基本思路是DFS,考虑到递归的栈消耗,于是用数组来实现非递归,时间复杂度为N!,上代码:
flag: 是否已经选中的标记,已经选择了为1,否则为0
state: 记录上一次搜索到的数字
data: 存放全排列
#include"iostream" #include <iomanip> using namespace std; void fullPerm(int N) { int *flag=new int ; int *state=new int ; int *data = new int ; memset(flag,0,sizeof(int)*N); memset(state, 0, sizeof(int)*N); int d = 0; int cnt = 1; while (true) { if (N == d)//到底了 { cout <<setw(3)<<cnt++<<": "; for (int i = 0; i < N; i++) cout << data[i]+1 << " "; cout << endl; d--;//回溯 flag[state[d]] = 0;//上去的时候释放选中的元素 state[d]++; } else { int s = state[d]; for (; s < N; s++)//寻找下一个没有被选中的元素 { if (0 == flag[s])//往下搜索 { data[d] = s; flag[s] = 1;//下来的时候选择元素 state[d] = s; d++; break; } } if (s == N)//中间层回溯 { state[d] = 0; d--; if (d < 0)//回溯到了最顶层 break; flag[state[d]] = 0; state[d]++; } } } delete[] flag; delete[] state; delete[] data; } void main(void) { int n; cin >> n; fullPerm(n); system("pause"); }
相关文章推荐
- C++用非递归实现二叉树的前序排列,中序排列,后续排列
- [原创]DataList横向排列数据如何实现交替行变色!
- 一个实现排列和组合的JavaBean
- 实现 DataGird 的升序和降序排列
- 如何用栈实现递归与非递归的转换
- 递归实现数字排列组合
- 如何用栈实现递归与非递归的转换
- dedecms实现文章按拼音声母排列
- 回溯实现数字的排列组合
- 回溯实现数组元素的排列组合
- 枚举数组中所有可能排列的代码实现 [2004年7月8日 1:57 ]
- 如何用栈实现递归与非递归的转换
- 使用非递归实现遍历目录
- C语言实现排列/组合算法
- 用java实现对数组的排列组合
- Delphi 程序窗口动画及正常排列平铺的实现
- n个数全排列的非递归生成算法,C实现
- 如何用栈实现递归与非递归的转换
- 素数环问题的非递归实现
- 我用Java实现的二叉树的遍历(递归和非递归)