Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って始めたブログ

Rubyでバブルソートを書いてみた

Rubyバブルソート処理を書いてみました。
Rubyは、「まつもと ゆきひろ」さんが生み出したプログラミング言語で、日本人で初めてメジャーとなった言語ですね。
日本人として、Rubyがどんな言語なのかを知っておかないといけないと思い、適当に(他のHP等を参考にして)バブルソート処理を書いてみました。

とりあえず書いたのがこちら

# バブルソート2
def bubble_sort2(array)
  # arrayのコピー
  ary = array.dup
  pos_max = ary.length - 1

  (0...(pos_max)).each{|n|
    (0...(pos_max-n)).each{|ix|
      # 隣と比較して前が大きかったら後ろと交換
      iy = ix + 1
      # 多重代入
      ary[ix], ary[iy] = ary[iy], ary[ix] if ary[ix] > ary[iy] #交換
    }
  }
  ary
end

puts "---------------------------"
array = 10.times.map{rand(100)}
p array
puts "---------------------------"
p bubble_sort2(array)
puts "---------------------------"

普段からRubyを書いていない人(僕)からすると、each文に違和感を感じたので、for文に書き直してみました。

# バブルソート
def bubble_sort(array)
  # arrayのコピー
  ary = array.dup
  pos_max = ary.length - 1

  for n in 0...(pos_max) do
    for ix in 0...(pos_max-n) do
      # 隣と比較して前が大きかったら後ろと交換
      iy = ix + 1
      # 多重代入
      ary[ix], ary[iy] = ary[iy], ary[ix] if ary[ix] > ary[iy] #交換
    end
  end
  ary
end

puts "---------------------------"
array = 10.times.map{rand(100)}
p array
puts "---------------------------"
p bubble_sort(array)
puts "---------------------------"

どちらのプログラムも同じ結果が出力されます。
僕も知らなかったのですが、for文とeach文の違いは、ブロック内の変数のスコープが異なるとのこと。

for文は、変数のiyやixをend外でも使う事ができますが、each文だと使えません。