问题提出:给定一个全序集,找到当前结构的下一组排列,比如123->132->213....
对待123,我们要找下一组排列,正常的想法是先看个位数3能不能替换成稍微大一点的数,而123中没有比3还大的数,所以不能换个位使这个数稍微变大一点成为下一组排列,所以我们开始找十位数,十位数是2,而个位数3正好比2大一点点,所以我们将3和2交换位置便能求出下一组排列132。
接着求132的下一组排列,也是一样从个位数开始,我们找比2稍微大一点的数,虽然找到3但是3在十位数上,与个位数的2交换之后会让数变得更小,所以没有合适的数能和2交换,接着看十位数3,显而易见也没有合适的数交换,最后看百位数1,发现2是第一比1大的,所以我们让1和2交换变为,231但是我们发现光是交换还不行,还要让31交换才能实现下一组排列。交换之后的下一组排列是213。
然后可以接着求出213的下一组排列,当我们求到最大的数321时,会发现全部都是按照这个规律,如果不放心可以再试一试1234(博主就很不放心)结果还是一样的。
所以总结一下规律就是,我们要从后往前找,当确定一个数i时,从后往前看i后面的序列是否有比i还要大的数,有的话交换这两个数的位置(有很多的话取第一个遇到比i大的数),接着将i后面的子序列转向(reversed方法)
贴上代码:
def permute(value): n = len(value) for i in reversed(range(n-1)): if value[i] < value[i+1]: break for j in reversed(range(i, n)): if value[i] < value[j]: value[i], value[j] = value[j], value[i] value[i + 1:] = reversed(value[i + 1:]) print(value) break permute(list('123'))
运行结果: