LexicographicPermute(求字典序的下一个字典序)

578 篇文章 ¥299.90 ¥399.90
570 篇文章 ¥299.90 ¥399.90
本文介绍了如何使用算法LexicographicPermute生成字典序下的排列。从1到n的所有排列,算法首先初始化为12...n,接着在每次迭代中寻找最大的i,满足ai<ai+1,并找到满足ai<aj的最大索引j,交换ai和aj,然后对ai+1到an的元素进行反序。以此方式逐步生成字典序列表。

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

伪代码

算法 LexicographicPermute(n)

//以字典序产生排列

//输入:一个正整数n

//输出:在字典序下{1,……,n}所有排列的列表

初始化第一个排列为12……n

While 最后一个排列有两个连续升序的元素 do

找到使得ai<ai+1的最大的i     //ai+1>ai+2>ai+3>……>an

找到使得ai<aj的最大索引j    //j>=i+1,因为ai<ai+1

交换ai和aj   //ai+1ai+2……an任保持降序

将ai+1到an的元素反序

将这个新排列添加到列表中

//14世纪印度时的某个算法,感叹啊,那个时候的人就这么聪明了
//此方法可以用来求字典序的下一个序列
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
void LexicographicPermute(int *a,int n)
{
    //开始时数组a[0,1,2,3,……,n-1]的序列时为1,2,3,4,5……n
    int k=n-2,j;
    for(int i=0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
    while(1)
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值