next_permutation()原理与运用
next_permutation函数,他的函数原型是
#include <algorithm>
bool next_permutation(iterator start,iterator end)
此函数求的是当前排列的下一个排列。这里的“下一个”,我们可以把它理解为序列的字典序的前后。
当当前序列不存在下一个排列时,函数返回false,否则返回true
例如输出1 2 3的全排列
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num[3]={1,2,3};
while(next_permutation(num,num+3))
{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}
return 0;
}
此时的结果是:
因为是输出当前排列的下一个排列,所以没有输出1 2 3.
如果想要输出1 2 3.
可以参考下面的代码。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num[3]={1,2,3};
do
{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+3));
return 0;
}
还应该注意的是,next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。
例如:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num[3]={2,1,3};
do
{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+3));
return 0;
}
此时数组为2,1,3
输出的结果为
所以next_permutation()在使用前需要对欲排列数组按升序排序。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num[3]={1,2,3};
do
{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+2));
return 0;
}
我们将
while(next_permutation(num,num+3));
改成了
while(next_permutation(num,num+2));
此时输出为
可以看出:next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。