1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

バブルソートアルゴリズムの簡易実装とRuby版

2022-01-04 21:10:45

アルゴリズムの原理

隣接する要素を比較する。もし1つ目が2つ目より大きければ、両方を入れ替えます。
同じことを、隣り合う要素の各ペアについて、先頭のペアから末尾のペアに至るまで行います。このとき、最後の要素が一番大きな数字になるはずです。
上記の手順を、最後の要素以外のすべての要素について繰り返します。
一度に比較できる数が少なくなるまで、上記の手順を繰り返してください。

実装
このような配列があったとします。[4, 1, 3, 2]
バブルソートは、最初の数から始めて、その数と後の数を比較し、その数が後の数より大きければ、それらの位置を入れ替えるというものである。
例えば、最初に4と1を比較して、4が1より大きいと分かったら、スワップ -> [1, 4, 3, 2] とします。
2回目に4と3を比較し、4の方がまだ大きいことがわかり、-> [1, 3, 4, 2]をスワップします。
3回目に4と2を比較し、やはり4が2より大きいので、-> [1, 3, 2, 4]を交換します。
こうして、最初のループの後、最大の数である4が、水底から泡のように立ち上がりながら配列の末尾に追加されます。そして、配列全体を並べ替えるには、一番大きい数字を最後にトップし、次に2番目に大きい数字を最後から2番目の位置にトップし、さらに3番目にトップする、というサイクルを繰り返します。

先ほどの配列に戻ると、2回目の比較が始まり、状態は[1, 3, 2, 4]になっています。
1と3を比較し、1が3より小さい場合はスキップ -> [1, 3, 2, 4] となります。
3と2を比較し、3が2より大きい場合、スワップ -> [1, 2, 3, 4] とする。
ラウンドはここで停止できます。なぜなら、1ラウンド目で最大の4が最後までトップになっているので、2ラウンド目は2番目に大きい数字が最後から2番目の数字をトップにしているかどうかを確認するだけでよいからです。

そしてラウンド3へ(とりあえずソートされたようですが)
1と2を入れ替えずに比較する[1,2,3,4]。
ここで、比較はすべて終了です。原理はとてもシンプルです。

def bubble_sort(list)
 list.each_index do |index|
  (list.length - index - 1).times do |e|
   if list[e] > list[e + 1]
    list[e], list[e + 1] = list[e + 1], list[e]
   end
  end
 end
end