论述题 5.  n(1,2,3,…,n)个元素有N!个不同的排列,将这n!个数按字典序排列,并编号0,1,…,n!-1,每个排号为其字典序的值,如n=3时,字典排序为123,132,213,231,312,321,这6个数的字典序分别为0,1,2,3,4,5,现给定n,请输出字典序为k的排列(0<=k<n!)。
【正确答案】算法的主要思路为:从当前字符串出发找出下一个排列(下一个排列为大于当前字符串的最小字符串)。
   通过引入一个例子来介绍非递归算法的基本思想:假设要对字符串“12345”进行排序。第一个排列一定是“12345”,依此获取下一个排列:“12345”->“12354”->“12435”->“12453”->“12534”->“12543”->“13245”->...。从“12543”->“13245”可以看出找下一个排列的主要思路如下:
   1)从右到左找到两个相邻递增的字符,在本例中,“12543”中从右到左找出第一个相邻递增的子串为“25”,记录这个小的字符的下标为pmin。
   2)找出pmin后面的比它大的最小的字符进行交换,在本例中,字符“2”后面的子串中比它大的最小的字符为“3”,因此,交换字符“2”和字符“3”可以得到字符串“13542”。
   3)为了保证下一个排列为大于当前字符串的最小字符串,在第2)步完成交换后,需要对pmin后的子串重新组合,使其值最小,只需对pmin后面的字符进行逆序即可(因为此时pmin后面的子串中的字符必定是按照降序排列,逆序后字符就按照升序排列了),逆序后就能保证当前的组合是新的最小的字符串;在这个例子中,上一步得到的字符串为“13542”,pmin指向字符“3”,对其后面的子串“542”逆序后得到字符串“13245”。
   4)依次类推,直到获取到字典序为k的排列为止。
   有兴趣的读者可以根据上述思路,自行实现代码。
【答案解析】