目录
next_permutation和prev_permutation这两个函数存在于#include<algorithm>中
本文以int数组num[]为例,其长度为n
next_permutation函数
此函数取num数组中元素的下一个组合(且下一个组合比原来的组合大,如果没有比原来的组合大的下一个组合则返回false),然后将组合出来的数赋给原数组,返回true
如:num数组的元素1 2 3组合一次后为1 3 2,此后num数组便为1 3 2
其运用方式为:
next_permutation(数组名,数组名+数组长度);
因为我们要获取num数组的全排列,所以就需要循环运用next_permutation函数进行重复排列,这里建议使用do while,这样可以把数组的原组合打印出来,作为一种排列方式:
do{
for(int i=0;i<n;i++)cout<<num[i]<<" ";
cout<<endl;
}while(next_permutation(num,num+n));//等于while(next_permutation(num,num+n)==true);,用来检测是否还有下一种组合
当然,next_permutation是输出原数组的下一个组合,如果想要输出全排列的话就需要从最小的组合开始(如:1 2 3),这里可以用到同为#include<algorithm>中的sort函数,将数组变为最小的组合,也就是将数组元素按从小到大的顺序排列,具体用法参考我的:c++ sort函数中的按从小到大排列,这里就不做详细介绍了,如果不需要全排列就不用用sort函数进行初始化,跳过此步即可,初始化如下:
sort(num,num+n);
prev_permutation函数
此函数与next_permutation函数恰恰相反,它是取num数组中元素的上一个组合(且上一个组合比原来的组合小,如果没有比原来的组合小的上一个组合则返回false),然后将组合出来的数赋给原数组,返回true
如:num数组的元素3 2 1组合一次后为3 1 2,此后num数组便为3 1 2
其运用方式为:
prev_permutation(数组名,数组名+数组长度);
因为我们要获取num数组的全排列,所以仍然需要循环运用prev_permutation函数进行重复排列:
do{
for(int i=0;i<n;i++)cout<<num[i]<<" ";
cout<<endl;
}while(next_permutation(num,num+n));//等于while(next_permutation(num,num+n)==true);,用来检测是否还有下一种组合
当然,prev_permutation是输出原数组的上个组合,如果想要输出全排列的话就需要从最大的组合开始(如:3 2 1)仍然用sort函数将数组变为最大的组合,现在需要将数组元素按从大到小的顺序排列,参考我的:c++ sort函数中的按从大到小排列,如果不需要全排列就不用用sort函数进行初始化,跳过此步即可,初始化时需要的排序函数如下:
bool cmp(int a,int b){//定义排序函数
return a>b;
}
排序:
sort(num,num+n,cmp);//排序
程序示例(注释都在程序中)
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b){//从大到小排序
return a>b;
}
int main(){
int n;
cin>>n;
int num[n];
for(int i=1;i<=n;i++)num[i-1]=i;//初始化num数组为从小到大的顺序,当然也可以采用输入
//next_permutation示例
cout<<"next_permutation示例:"<<endl;
sort(num,num+n);//其实不需要,但是采用输入的话,想要全排列就必须要这行
do{
for(int i=0;i<n;i++)cout<<num[i]<<" ";//打印
cout<<endl;
}while(next_permutation(num,num+n));//将num数组变为下一种组合
//prev_permutation示例
cout<<"prev_permutation示例:"<<endl;
sort(num,num+n,cmp);
do{
for(int i=0;i<n;i++)cout<<num[i]<<" ";//打印
cout<<endl;
}while(prev_permutation(num,num+n));//将num数组变为上一种组合
}
运行结果:
如有疑问欢迎私信或评论区留言!