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

2017年4月16日

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

相変わらず人気のRubyですが、未だにどうもしっくり馴染めない下駄なんですが、書き込む行数がまだまだ少ないからでしょうね。 フレームワークなどを触ってみると意外と好きになるかもね〜。 ところで、他の言語よりRubyの優位点があるところって、どんなところなんでしょう? この辺が明確にわかると、面白くなるかもしれないな〜。

ソース

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"

実行

$ ruby bucketSort.rb [1, 1, 1, 2, 2, 3, 4, 4, 6, 6]

解説

配列要素の存在確認

phpで言うところの「isset」、javascriptでは「typeof」のような確認は、Rubyでは、is_keyやis_valueでできるんですが、配列の要素に関しては、「nil」で確認するのが良さそうです。 ちなみに、配列の定義において、以下のような挙動を知っておくと、エラーを回避しやすいかもしれませんね。 arr = [] arr[1] = 10 print arr > [nil , 10]

Rubyのfor文

今一度、Rubyのfor文は存在しないので、下記のようなstep文を理解しておきましょう。
(開始数).step(終了数 , step数){ | 代入する変数 | ... }
慣れると便利なんですが、他の言語にない処理なので、慣れるまでが少ししんどいかも。

繰り返し文のcontinue

Rubyは多言語でいうところの「continue」の代わりに「next」を使うので、覚えておきましょう。 (0).step(10,1){ |i| if i < 5 then next end print i } > 5 > 6 > 7 > 8 > 9 > 10

関連リンク

wikipedia たくさんのプログラム言語でアルゴリズム学習

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。