Python洗牌算法重写

Python有自带的洗牌算法函数shuffle().

自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(4)的例子:

 1 import random
 2 
 3 def shuffle1(lst) :
 4     l = len(lst)
 5     if l <= 1 : return lst
 6     
 7     i = 0
 8     while l > 1 :
 9         j = int(random.random() * l)
10         t = lst[i]
11         lst[i] = lst[i+j]
12         lst[i+j] = t
13         i = i + 1
14         l = l - 1
15         
16     return lst

执行结果:

 1 b = [0,1,2,3,4,5,6,7,8,9]
 2 print shuffle1(b)
 3 
 4 [9, 5, 7, 1, 8, 2, 3, 6, 0, 4]
 5 [2, 4, 7, 3, 8, 5, 6, 9, 0, 1]
 6 [3, 0, 8, 7, 1, 6, 5, 4, 9, 2]
 7 [5, 8, 2, 9, 7, 1, 4, 0, 3, 6]
 8 [7, 8, 0, 3, 9, 6, 1, 2, 4, 5]
 9 [2, 4, 8, 7, 3, 6, 1, 0, 9, 5]
10 [2, 5, 9, 8, 4, 3, 0, 6, 1, 7]
11 [6, 0, 1, 9, 2, 3, 4, 7, 5, 8]
12 [5, 4, 0, 8, 6, 7, 9, 2, 3, 1]
13 [3, 9, 2, 8, 5, 7, 6, 1, 0, 4]

后面再琢磨能不能降低一下时间复杂度。

比如洗4副牌,可以开4个线程同时洗,通过并行提高性能。

也可以一个线程洗,每次以4张或者更大数目切牌,也能达到较好的效果。

原文地址:https://www.cnblogs.com/danxi/p/6397085.html