字典序,自己之前并没有很多的了解,最近在做题的时候发现出现的还是挺频繁的,索性今天找出来好好研究学习一下,在这里主要是根据网上的一篇博文来学习的,感觉讲的很容易理解这里就不多说了需要的话可以去看看。
对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。
示例: 1 2 3的全排列如下:
1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1
我们这里是通过字典序法找出来的。
那么什么是字典序法呢?
从上面的全排列也可以看出来了,从左往右依次增大,对这就是字典序法。
上面的博文实现了C语言的字典序方法,在这里给出来python的字典序全排列算法的实现,下面是代码:
#coding:utf8
'''
功能:python实现字典序
'''
import random
def generate_random_numbers(total_num=10, max_num=20):
num_list = []
for i in range(total_num):
num_list.append(random.randint(0, max_num))
return num_list
def dict_sort(num_list):
final_list=[]
num=1
decrease_list=sorted(num_list, reverse=True)
increase_list=sorted(num_list)
for i in range(len(increase_list)):
num*=increase_list[i]#A(n,n)代表所有元素的全排列数量
while num:#这里循环产生A(n,n)次
for i in range(len(num_list)-2,-1,-1):
if num_list[i]<num_list[i+1]:
flagi=i
break
for j in range(len(num_list)-1,flagi,-1):
if num_list[j]>num_list[flagi]:
flagj=j
break
# num_list[i], num_list[j]=num_list[j], num_list[i]
num_list[flagi], num_list[flagj]=num_list[flagj], num_list[flagi]
num_list2=sorted(num_list[i+1:])
result_list=num_list[:i+1]+num_list2
final_list.append(''.join([str(x) for x in result_list]))
num-=1
return final_list
if __name__ == '__main__':
num_list1=[1,2,3]
num_list2=[1,2,3,4]
final_list1=dict_sort(num_list1)
print '**************************num_list1全排列组合为:**************************'
print final_list1
print len(final_list1)
final_list2=dict_sort(num_list2)
print '**************************num_list2全排列组合为:**************************'
print final_list2
print len(final_list2)
其中的随机数生成器最终并没有用到可以删除的,下面是结果:
**************************num_list1全排列组合为:**************************
['132', '123', '312', '213', '321', '231']
6
**************************num_list2全排列组合为:**************************
['1234','1243','1324','3142','3241','3214','1342','1423','1432','2431','3124','3412','3421','2134','2143','4312','4321','2314','2341','2413','4123','4132','4231','4213']
24