递归与分治——字典序排列

问题描述:

n个元素{1,2,…, n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值如下:

任务:给定n 以及n 个元素{1,2,…, n }的一个排列,计算出这个排列的字典序值,以及按字典序排列的下一个排列。 
Input

第1 行是元素个数n(n < 15)。接下来的1 行是n个元素{1,2,…, n }的一个排列。

Output

第一行是字典序值,第2行是按字典序排列的下一个排列。

Sample Input 

2 6 4 5 8 1 7 3

Sample Output 
8227 
2 6 4 5 8 3 1 7 

———————————————————————————–

思路:

1,2对应:1 * 后7位数字全排列

    26对应:21,23, 24, 25 * 后6位数字的全排列 

    以此类推。。。

{2,6,4,5,8,1,7,3}的字典序值为
1*7!+4*6!+2*5!+2*4!+3*3!+0*2!+1*1!=8227

2, 从末尾找第一个减小的数,替换成后面的比该数字大的最小数,剩下的从小到大排列 我们来看,       {…,4,6,9}的下一排列为{…,4,9,6},       {…,4,9,6}的下一排列为{…,6,4,9}; 如果再进一步看
{…,3,9,6,4}的下一排列为{…,4,3,6,9}
启示:用比3(第一个减小的数)大的最小数4顶替3的位置,剩下的数从小到大全排列

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/huangxy10/article/details/7782879
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞