スターリンソートなるものが偉大なる先人によって巷で流行りまくっているので、このビッグウェーブに乗るしかないということで、bashでやってみました。
しかしながら、文系すぎて$O(n)$とか意味わからんちんなので、アルゴリズム的に粛清されないかは保証できません。
コード
one_liner.sh
b=(${1});for a in ${@:2};do [ ${a} -ge ${b[-1]} ]&&b+=(${a});done;echo ${b[@]}
functionized.sh
stalin_sort () {
b=(${1})
for a in ${@:2}
do
if [ ${a} -ge ${b[-1]} ]; then
b+=($a)
fi
done
echo "${@} => ${b[@]}"
}
list1=(1 2 3 4 5 6 7 8 9)
stalin_sort ${list1[@]}
list2=(9 8 7 6 5 4 3 2 1)
stalin_sort ${list2[@]}
list3=(1 2 4 3 6 8 0 9 5 7)
stalin_sort ${list3[@]}
list4=(1 1 2 8 3 6 8 52 9 5 7)
stalin_sort ${list4[@]}
funcの実行結果
1 2 3 4 5 6 7 8 9 => 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 => 9
1 2 4 3 6 8 0 9 5 7 => 1 2 4 6 8 9
1 1 2 8 3 6 8 52 9 5 7 => 1 1 2 8 8 52
粛清感...低すぎ!?
解説
b=(${1})
与えられた引数の最初の数字をぶち込んだArrayを生成
for a in ${@:2}
Arrayの2番目の要素から最後までをループ
${b[-1]}
生存リストArray(b)の最後の要素と比較(-1記法はbash4.3から)
b+=($a)
生存リストArrayの最後に粛清を免れた数字を投獄
終わりに
言いたかったことは、bash4.3からArrayの最後の要素簡単に取れますってことです。
ちなみに、これMacで検証したんですが、次のMacOSからログインシェルはzshなんですよね...。
諸行無常。
現場からは以上です。