[アルゴリズム] 選択ソートの実装(Shell編)

2017年1月8日

Shell テクノロジー プログラミング 特集

選択ソートもこなれてきてshell言語での記述を行いたいと思います。 基準をPHPとして、書き直しをするだけで、ほぼ問題なく実行できてしまうので、複数言語対応も慣れると、共通な書き方があることに気がついてくる。 言語ならではの特徴を表してもいいのだが、現時点では、汎用性を有効に考えて行なっていきたいと思うので、もっといい書き方があれば、コメントなどで反映させていこうと思います。

ソースコード

#/bin/sh function selectSort(){ # 値の受取処理 arr=($@) cnt=${#arr[@]} # 数値配列を最初から順番に評価していく for((i=0; i<$cnt-1; i++)){ # 最小値の格納変数(最初は評価対象数値を入れておく) min=${arr[@]:$i:1} # 入れ替え対象番号用変数 num=$i # 評価番以降の一番低い数値を取得 for((j=$num+1; j<$cnt; j++)){ currentNum=${arr[@]:$j:1} if [ ${min} -gt ${currentNum} ]; then num=$j min=${arr[@]:$j:1} fi } # 評価番号と入れ替え番号が同じ場合は入れ替えなしとして処理無し if [ $num -eq $i ]; then continue fi # 評価番号と入れ替え番号の値を入れ替える changeNum=${arr[@]:$i:1} arr[${num}]=${changeNum} arr[${i}]=${min} } echo ${arr[@]} } # 実行 numbers=("10 2 12 7 16 8 13") res=`selectSort $numbers` echo ${res[@]}

実行

$ bash selectSort.sh 2 7 8 10 12 13 16

解説

PHPバージョンからの書き直しで行なったんですが、基本的にほとんどのコードが類似で書き直しができた。 ただ、shellのfunctionの受け渡し値がどうしても多言語のように、値で受け渡すことができず、ARGV扱いで行うしか無いので、この点が非常にやりずらい。 関数内でわざわざ、変数に格納してつかわないといけないのも面倒くさい。

shコマンドのトラブル

macのshコマンド実行とubuntuのshコマンド実行でトラブルあり。 ubuntuでは、コマンドをbashにすることで無事に実行する事ができたのだが、shとbashの違いが現れたので、macのshellよりはubuntuのshellの方が本番実行に近いのでそちらを有効に考えたいと思います。 ちなみに、ubuntuでのshコマンドを実行した際にfunction関数が正常に動作しませんでした。

配列の扱い

shellで配列から値を取り出す時に 「${arr[@]:$i:1}」としているが「${arr[$i]}」としてもいいし、多言語との互換を考えて「$arr[$i]」としても問題ない。 いくつか書き方のバージョンがあるのは、もちろん便利に使えるポイントもあるので、気になる人は調べてみるともっと効率いい書き方にたどり着けるかも。

functionの返り値に配列

shellのfunctionの返り値で配列にしたい場合は、ソースコードを参照して「${arr[@]}」とすることで配列の全てを返すことができる。 「$arr」として返すと配列の最初の1つ目の値しか返らないのでトラブルの元です。 お作法として覚えておきましょう。

関連リンク

いろいろなプログラム言語でアルゴリズム学習