睡眠排序——沒什麼事是睡一覺解決不了的

新年快樂呀javascript

前幾天看到一段js代碼,腦洞屬實夠大。java

const original = [3, 1, 15, 2, 9, 6, 3, 2, 7, 1]
const result = []

original.forEach(n => setTimeout(() => result.push(n), n))

以上代碼利用setTimeout()函數,對於要排序的數組,根據不一樣的數值在不一樣的線程中休眠不一樣時間在push進結果中,以此來實現排序。python

這種排序算法被稱爲「睡眠排序」。試着用Python來寫個多線程程序玩一下。算法

import time, threading


original = [3, 1, 15, 2, 9, 6, 3, 2, 7, 1]
result = []
# 存儲線程實例的列表
pool = []

# 睡眠後append
def sleepSort(num):
    time.sleep(num)
    result.append(num)

# 建立多個線程
for i in range(len(original)):
    t = threading.Thread(target=sleepSort, args=(original[i],))
    pool.append(t)

for t in pool:
    t.start()

for t in pool:
    t.join()

print(result)

我沒有對源數據作任何處理就將其作爲time.sleep()的參數了,因此這個時間花費嘛,嘿嘿,娛樂娛樂就行數組

另外,threading模塊中還有個Timer類,其第一個參數接收一個數值爲指定的定時時間,其他地方和Thread同樣,時間到後再調用要執行的function。改寫的代碼以下:多線程

import time, threading


original = [3, 1, 15, 2, 9, 6, 3, 2, 7, 1]
result = []
pool = []

def sleepSort(num):
    time.sleep(num)
    result.append(num)

for num in original:
    t = threading.Timer(num, sleepSort, args=(num,))
    pool.append(t)

for t in pool:
    t.start()

for t in pool:
    t.join()

print(result)
相關文章
相關標籤/搜索