使用 Sleep 來做排序 (Bash shell)

一個很有趣的 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 # 沒辦法排序負數.

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈使用 Sleep 來做排序 (Bash shell)〉中有 2 則留言

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料