c++ 全排列(next_permutation和prev_permutation)

目录

next_permutation函数

prev_permutation函数

程序示例(注释都在程序中)


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数组变为上一种组合 
}

运行结果:

 如有疑问欢迎私信或评论区留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值