康托展开
作用:求无重复元素的集合中,任意一种排列方式在其全部按字典序排列中的位置。
算法:Ans=

说明:其中a[i]表示---[第i个数>第(i+1~n-1)个数] 的个数。
例子: 2 1 4 3
比2小的有1个:1*3!
比1小的有0个:0*2!
比4小的有1个:1*1!
比3小的有0个:0*0!
所以2 1 4 3在{1、2、3、4}的全部排列中(按字典序)排第7个(从0开始)。
代码
输入:perm[] 所求排列
n 元素个数
输出:Ans 所在位置
int cantor(int perm[],int n)
{
int fact[20]={1,1,2,6,24,120,720,5040,40320,362880,3628800};//阶乘表
int Ans=0;
for(int i=0;i<n;++i)
{
int ctor=0;//计数
for(int j=i+1;j<n;++j)
{
if(perm[i]>perm[j])
++ctor;
}
Ans+=ctor*fact[n-1-i];
}
return Ans;
}

浙公网安备 33010602011771号