一個很有趣的 Shell script, 使用 Sleep 來做排序.
原文: Genius sorting algorithm: Sleep sort
Sleep sort 程式碼
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
執行
$ ./sleepsort.bash 5 3 6 3 6 3 1 4 7
程式碼說明
- 程式寫法主要就是寫一個 Function, 然後, 在下面將每個參數丟進那個 Function 裡面, 然後丟進背景執行, 而 f() 裡面會接收參數, 進入 sleep 中, sleep 完後, 就將值印出來.
- 再講簡單點: 一次丟一個值給 f(), 然後 f() 開個背景 Thread 執行, 每個 Thread 都 Sleep 那個值, Sleep 完後, 就直接印出來.
- 主要重點是這段: "f "$1" &" => 丟進背景執行
此程式跑的時間也可以很明顯知道, 就是數字最大的那個時間, 也可以用下面的方式跑:
- ./sleepsort.bash 0.2 0.3 0.1 1 # 可以在 1秒內跑完
但是如果資料很多, 因為丟進去背景時間得順序不同, 所以可能就會有排序錯誤得 Bug 產生. (因為 Thread 還沒產生出來, sleep 已經睡醒了)
註: 要準確也可以, 需要花點時間就一定可以準確 (把 & 背景執行得時間計算進去後, 在加上一點時間, 就可以準確)
這個好處是, 不需要暫存變數, 就可以完成排序. 缺點是上面講的, 可能會有點 Bug, 如果要算很精準, 可能不太建議使用, 然後另一個是不能排負數. (因為 sleep 不能給負數)
- ./sleepsort -1 -2 -3 # 沒辦法排序負數.