作用:求无重复元素的集合中,任意一种排列方式在其全部按字典序排列中的位置。
算法: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; }