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

2017年4月16日

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

t f B! P L
相変わらず人気の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 たくさんのプログラム言語でアルゴリズム学習

このブログを検索

プロフィール

自分の写真
町田市, 東京都, Japan
プログラミングとサーバーを心の底から楽しむクリエーターです。 経営者であり、開発者でもありますが、得意としているのは、アイデア創出。

ブログ アーカイブ

QooQ