アルゴリズムプログラミングシリーズ第2弾の選択ソートの締めを飾るのはRuby言語です。
未だに馴染めないこの言語の原因が今回コーディングしてみて改めてよくわかりました。
この言語に慣れてしまうと、他の言語が触りづらくなる・・・と直感で感じています。
世の中のルバーの方、僕にこの言語の良さを教えてくれませんか?
ソースコード
def selectSort(numbers)
# 数値配列を最初から順番に評価していく
#(numbers.count-1).times do |i|
(0).step(numbers.count-2 , 1) { |i|
# 最小値の格納変数(最初は評価対象数値を入れておく)
min = numbers[i];
# 入れ替え対象番号用変数
num = i;
# 評価番以降の一番低い数値を取得
(num+1).step(numbers.count-1 , 1){ |j|
if min > numbers[j] then
num = j;
min = numbers[j];
end
}
# 評価番号と入れ替え番号が同じ場合は入れ替えなしとして処理無し
if num == i then
next;
end
# 評価番号と入れ替え番号の値を入れ替える
numbers[num] = numbers[i];
numbers[i] = min;
}
numbers
end
puts selectSort([10,2,12,7,16,8,13]);
結果
$ ruby selectSort.rb
2
7
8
10
12
13
16
表示方法は二の次に考えるとして、とりあえず問題なさそうですね。
解説
前回も書いたのですが、rubyは繰り返し文が他の言語と全く書き方が違うため非常に扱いづらい印象です。
前回のバブルソートの時はwhileを使ったんですが、今回はstepという命令を使ってます。
任意の下層値から、上限値までの階段loopを行いたい場合、通常の言語ではfor文なのですが、rubyのfor文はPHPで言うところのforeachしか存在しないため、stepという独自の方式があるんだと思いますが、正直種類が増えて便利になるというという部分に使いづらさを感じてしまいますね。
まあ、言語避難はこの際やめておきますが、今回扱っている8言語で唯一loop処理で「continue」が使えないという事もわかりました。
Rubyでは繰り返し文の中で次の処理に飛ばす方法は「continue」ではなく「next」という事でした。
continueでは実行エラーになるので、要注意です。
あと、stepでも注意点があり、多言語の感覚でfor(i=0; i<10; i++)としたい場合、まずstep処理の構文は以下のようになっているようです。
[開始値].step(上限値 , 足し込む値(省くと1になる)) |[内部変数]|{
...
}
上限値が常に「以下」扱いである事を認識しておきましょう。なので、多言語的に書くと「for(i=0; i< =10; i++)」となるので、配列などの要素数を上限値にする場合は0スタートを考慮して上限値に「-1」を入れてあげる必要があるという事です。
関連リンク
いろいろなプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿