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