>& STDOUT

主にソフトウェアに関する日々の標準出力+標準エラー出力

sleep sort の解説

どこで笑っていいのか判らない人のために解説。
こういうのがたまに出てくるから止められない。

#!/bin/bash
function f() { #関数fの定義
    sleep "$1" #第1引数の数だけsleepする
    echo "$1" #sleepが終わったら標準出力にその引数を表示する
}
while [ -n "$1" ] #引数の数だけループ
do
    f "$1" & #関数fをバックグラウンドで実行(&) ※ここがキモ。ドンドン後ろに回す
    shift #引数をずらして"$1"に入れていく
done
wait #後ろに送ったジョブの終了を待つ
example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7


引数に「3 5 10 1 7 9 7 4」と与えられたとき、「f "$1" &」によって8つのジョブが(ほぼ)同時に走り、1秒経った時点で「echo 1」3秒経った時点で「echo 3」が実行され ... 10秒後に「echo 10」が実行されて完了します。このソートのすごい?ところは、実行に掛かる時間の中で支配的なのが大抵のソートアルゴリズムにおける「要素数」ではなく「要素の中の最大値」である部分です。なお、元ネタの掲示板では、すぐに10倍速まで最適化されました。

sleep $(echo "$1 / 10" |bc -l) #引数を10で割る bc は小数計算の為に渡す


もちろん「数字しか出来ねーじゃねーかよ!」とか「100万渡すと100万秒待つのかよ!」とか誰でも思うのですがそれは置いといて純粋にこのアルゴリズム、、、うーん、、アルゴリズム、、、の、、発想に賞賛を贈りたいです。