Python实现“睡眠排序”
算法思想:
3 | 1 | 6 | 4 | 2 | 5 | 4 | 1 |
---|
睡眠排序的算法思想非常简单。例如,对于上述列表中的数字如何排序?首先,我们假设,让列表里面的数字全去一个房间“睡觉”。然后,列表第一个元素“3”,我们让它3秒后走出房间。第二个元素“1”,让它1秒后走出房间。第三个元素“6”,让它6秒后走出房间。。。。。。以此类推,当所有数字都走出房间后。它们就成为了下方列表,从1到6递增的有序状态。
1 | 1 | 2 | 3 | 4 | 4 | 5 | 6 |
---|
如何模拟数字“睡觉”这个过程呢?当然是用sleep()函数,Python导入time这个模块就可以使用它了。
如何让数字同时“进入房间”呢?答案是使用线程池加map()函数。简单说一下map()函数用法。map(function, list, …),它接收一个function(函数) 和一个 list,并通过把function依次作用在 list 的每个元素上,得到一个新的 list 并返回。
不说了,下面上代码:
import time
from multiprocessing.dummy import Pool
def my_sort(int):
time.sleep(int/1000)
list2.append(int)
list1=[1,3,2,2,3,1,2,3]
pool =Pool(len(list1)) # 根据需排序的列表长度,创建线程池内线程个数
list2=[] # 用来存放排好序后的元素
pool.map(my_sort,list1)
print(list2)
运行截图:
总结:
睡眠排序思路很有趣,具有一定参考价值。但是,它的实用性,很大程度上,是比不上经典排序算法的,例如合并排序,快速排序等等。
补充:
首先,若元素太大,例如1000000,这个算法可能就“睡过头”了(时间开销太大)。其次,若要对负数进行排序,又该怎么办呢?
解决思路是:将要排序的数据,进行归一化处理后再睡眠排序。有兴趣的朋友可自行百度。