康托展开

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

算法: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;
}

  

原文地址:https://www.cnblogs.com/l1l1/p/8687255.html