STL中计算排列组合关系的算法
2016-03-26 13:36
411 查看
算法思想:首先,从最尾端开始往前寻找两个相邻的元素,令第一个元素为*i,第二个元素为*ii,且满足 *i < *ii 。找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*j,将i,j元素对调,再将ii之后的所有元素颠倒排列。此即所求之“下一个”排列组合。 STL中函数名称为next_permutation,这里改为next_permutate,下面是具体实现:
template <class BidirectionalIterator> bool next_permutate(BidirectionalIterator first, BidirectionalIterator last) { if (first == last) return false; BidirectionalIterator i = first; ++i; if (i == last) return false; i = last;//i指向尾端 --i; for (;;) { BidirectionalIterator ii = i; --i; //以上锁定一组(两个)相邻元素 if (*i < *ii) { //从后往前找第一个大于*i的元素*j BidirectionalIterator j = last; while (!(*i < *--j)); iter_swap(i,j); //i,j对调 reverse(ii,last);//将ii之后的所有元素颠倒排序 return true; } //如果进行至最前面了,全部逆向重排 if (i == first) { reverse(first,last); return false; } } }
测试一下:
int main(void) { string s = "abcd"; cout<<s<<endl; while( next_permutate(s.begin(),s.end()) ) { cout<<s<<endl; } return 0; }
输出:
相关文章推荐
- Linux内核分析——扒开系统调用的三层皮(下)
- 删同义词
- C# 图片处理心得
- 测试负责人和测试工程师在日常工作有什么不同
- MaterialDesign之RecyclerView学习笔记
- 关于adb不支持直接GC的另类解决办法
- How to be a programmer中文版
- day09 用Myeclipse开发servlet,servlet的生命周期(面试题),ServletContext
- 《MySQL必知必会学习笔记》过滤数据
- 尝试使用七牛作为图床
- 提醒通知对话框
- 软件工程个人作业03
- 删表空间及数据文件
- 分析system_call中断处理过程
- Ubuntu14.04后台进程Nohup
- 欢迎使用CSDN-markdown编辑器
- 第五课_课后习题解答
- TSC条码打印机亮红灯解决办法!
- 递归经典问题详解
- 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)