Post

Rubyの範囲演算子は降順のイテレートに使えないこと

初めてアルゴリズムを勉強していたとき、バブルソートの方法を使って配列を降順にソートするプログラムを書くという課題で躓いていたところをメモする。

プログラムは下記のように作成したけど、どうしてもソートできなかった。

1
2
3
4
5
6
7
8
9
10
11
arr = [4, 5, 2, 1, 3]
size = arr.size
max = size - 1

(0..(max-1)).each do |i|
  (max..(i+1)).each do |j|
    if arr[j] < arr[j-1]
      arr[j], arr[j-1] = arr[j-1], arr[j]
    end
  end
end

そして下記で試したところ、 (max..(i+1)).each do |j|が動かなかったことにようやく気づいた…

1
2
3
4
5
6
7
8
9
10
(0..max).each do |i|
  p "i = " + i.to_s
  (max..(i+1)).each do |j|
    p "j = " + j.to_s
    if arr[j] < arr[j-1]
      arr[j], arr[j-1] = arr[j-1],arr[j]
    end
    p arr
  end
end

調べたら、Rubyでは(5..1).each doのように、範囲演算子が降順のイテレートに使いえないそうだ。

下記に修正したら、うまくソートできた。

1
 ((i+1)..max).reverse_each do |j|

参照:

Rubyの範囲演算子は降順のイテレートには使えない

【Ruby】1..4の逆をしたい

Array#reverse_each

This post is licensed under CC BY 4.0 by the author.