康托展开:

给定一个排列(由n个数排列而成),我们可以计算出该排列在由n个数组成的所有排列中排名第几(按字典序),这就是康托展开。

比如由4个数1,2,3,4组成排列

那么2413在所有的排列中排第几呢?

首先计算第一位数字比2小的排列有多少种,即 1 * fac[3],怎么得来的呢?首先比2小的数字只有1个,那么第一位数字只有一种选择,剩下的三位数字有fac[3]种选择,所以是1 * fac[3]

现在当第一位固定是2,那么来计算第二位数字比4小的排列有多少种呢?首先比4小的数字有1个,那么第一位数字只有一种选择,剩下的两位数字有fac[2]中选择,所以是1*fac[2]

依次类推,当前两位固定为24,第三位比1小的排列有0 * fac[1]

以此类推,当前两三位固定为241时,第4位比3小的排列有0*fac[0];

即fac[3] + fac[2] = 8;特别记住,我们算出来的是比2413小的排列有多少种,所以2413在所有由1,2,3,4组成的排列中排名第9。

 1 int KT(int *a, int n)//算出数组中存储的数字在全排列中排第几
 2 {
 3     int i,j,cnt,pos = 0;
 4     for(i=0; i<n; ++i)
 5     {
 6         cnt = 0;
 7         for(j=i+1; j<n; ++j)
 8             if(a[j] < a[i])
 9                 cnt++;
10         pos += cnt * fac[n-i-1];
11     }    
12     return pos + 1;
13 }
View Code

相关文章: