next_permutation() 全排列函数

本文深入解析了全排列的概念及其在编程中的应用,介绍了STL中next_permutation和prev_permutation函数的使用方法,通过实例展示了如何获取集合的所有可能排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    排列(Arrangement),简单讲是从 NNN 个不同元素中取出 MMM 个,按照一定顺序排成一列,通常用A(M,N)A(M,N)A(M,N)表示。当M=NM=NM=N时,称为全排列(Permutation)。
    从数学角度讲,全排列的个数A(N,N)=(N)∗(N−1)∗...∗2∗1=N!A(N,N)=(N)*(N-1)*...*2*1=N!A(N,N)=(N)(N1)...21=N!,但从编程角度,如何获取所有排列?那么就必须按照某种顺序逐个获得下一个排列,通常按照升序顺序(字典序)获得下一个排列。

    例如对于一个集合A=A=A={1,2,31,2,31,2,3},首先获取全排列a1:1,2,3a1: 1,2,3a1:1,2,3;然后获取下一个排列a2:1,3,2a2: 1,3,2a2:1,3,2;按此顺序,AAA 的全排列如下:

a1:1,2,3a1: 1,2,3a1:1,2,3 ;  a2:1,3,2;a2: 1,3,2;a2:1,3,2;   a3:2,1,3a3: 2,1,3a3:2,1,3 ;  a4:2,3,1a4: 2,3,1a4:2,3,1 ;  a5:3,1,2a5: 3,1,2a5:3,1,2 ;  a6:3,2,1a6: 3,2,1a6:3,2,1 ;  共 666 种。

    那么我们有时就需要求下一种全排列,在STL中的algorithm已经给出了一种健壮、高效的方法,即 next_permutation(int *begin, int *end)
    注意,这个函数是直接将传递的数组转换成了下一个全排列数组,并且有一个返回值。
    当返回为 111 时,表示找到了下一全排列;返回 000 时,表示无下一全排列。注意,如果从begin到end为降序,则表明全排列结束,逆置使其还原到升序

    因而我们可以用这个返回值求得所有的全排列

同时,相对应的,上一个排列即为prev_permutation(int *begin, int *end)

#include<bits/stdc++.h>
using namespace std;

int main() {
	char a[3]= {'a','b','c'}; //第一个排列保证正序,有时候根据题目要求,需要对其进行排序处理。
	for(int i=1; i<=6; i++) { //i为总共排列的个数  ,及 3!
		for(int j=0; j<3; j++)
			printf("%c ", a[j]);
		printf("\n");
		next_permutation(a, a+3);//放在第一个排列的后边,输出第一个排列的下一个排列
	}
	printf("*******************\n");
	
	int b[4]= {0,1,2,3};
	do{
        for(int i=0; i<4; printf("%d ", b[i++]));
        printf("\n");
    } while(next_permutation(b, b+4));
    printf("*******************\n");
    
    int c[3]={3,2,1};
	next_permutation(c, c+3);
	for(int i=0; i<3; printf("%d ", c[i++]));
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值