C++ STL中next_permutation的实现

来源:互联网 发布:win7开机优化加速 编辑:程序博客网 时间:2024/06/06 17:09

next_permutation包含于头文件algorithm中,是经常使用的笔者经常使用的一个函数,在算法竞赛题目中颇为好用,特别是一些猜数字问题,这个函数完全避免了多层循环的问题,使得很多问题不需要自己动脑子一样简单,笔者因此对其实现原理非常感兴趣,查阅相关资料后终于恍然大悟,简单起见,只对整型数组做了测试,详细部分看如下代码,已经写得非常清楚,希望对读者有所帮助。

#include<iostream>#include<algorithm>//包含reverseusing namespace std;bool next_permutation(   int* first,    int* last  )  {      if(first == last)          return false; //空序列      int* i = first;      ++i;      if(i == last)          return false;  //一个元素,没有下一个序列了      i = last;      --i;      for(;;) {          int* ii = i;          --i;          if(*i < *ii) {  //找到第一组连续且满足*i<*ii             int* j = last;              while(!(*i < *--j));              iter_swap(i, j);              reverse(ii, last);              return true;          }          if(i == first) {              reverse(first, last);  //全逆向,即为最小字典序列,回到起始状态,可以自己体会得到              return false;          }      }  }  int main(){    int a[10]={1,2,3,4,5,6,7};    do{        for(int i=0;i<5;i++)            cout<<" "<<a[i];        cout<<endl;    }while(next_permutation(a,a+5));//为了截屏方便,少量数据测试     return 0;}

运行结果如下,与头文件中该结果一致

这里写图片描述

0 0