[アルゴリズム] バケットソート(Ruby編)

相変わらず人気のRubyですが、未だにどうもしっくり馴染めない下駄なんですが、書き込む行数がまだまだ少ないからでしょうね。
フレームワークなどを触ってみると意外と好きになるかもね〜。
ところで、他の言語よりRubyの優位点があるところって、どんなところなんでしょう?
この辺が明確にわかると、面白くなるかもしれないな〜。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
def bucketSort(numbers) bucket = [] max = 0 (0).step(numbers.count-1 , 1){ |i| if bucket[numbers[i]] == nil then bucket[numbers[i]] = 0 end bucket[numbers[i]] += 1 if max < numbers[i] then max = numbers[i] end } arr = [] (0).step(max , 1){ |i| if bucket[i] != nil then (0).step(bucket[i]-1 , 1){ |j| arr.push(i) } end } return arr end numbers = [1,1,3,2,4,6,1,2,4,6] nums = bucketSort(numbers) print nums,"\n" |
実行
1 2 |
$ ruby bucketSort.rb [1, 1, 1, 2, 2, 3, 4, 4, 6, 6] |
解説
配列要素の存在確認
phpで言うところの「isset」、javascriptでは「typeof」のような確認は、Rubyでは、is_keyやis_valueでできるんですが、
配列の要素に関しては、「nil」で確認するのが良さそうです。
ちなみに、配列の定義において、以下のような挙動を知っておくと、エラーを回避しやすいかもしれませんね。
1 2 3 4 |
arr = [] arr[1] = 10 print arr > [nil , 10] |
Rubyのfor文
今一度、Rubyのfor文は存在しないので、下記のようなstep文を理解しておきましょう。
(開始数).step(終了数 , step数){ | 代入する変数 |
…
}
慣れると便利なんですが、他の言語にない処理なので、慣れるまでが少ししんどいかも。
繰り返し文のcontinue
Rubyは多言語でいうところの「continue」の代わりに「next」を使うので、覚えておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
(0).step(10,1){ |i| if i < 5 then next end print i } > 5 > 6 > 7 > 8 > 9 > 10 |
関連リンク
マージソート記事
解説
Javascript
PHP
Python
Shell
AWK
C言語
Go言語
Ruby
参考になりました。ありがとうございました。
http://obelisk.hatenablog.com/entry/2017/07/28/004142