バブルソート(bubble sort)

隣り合う値を比較して入れ換えていき、右端から確定していく。
最初は再帰で書いてたんだけど必要ないことに気がついた。配列を汚染しないように dup でコピーを作ってからにしてみた。

def bubble_sort(list)
  dup = list.dup
  (dup.length - 1).downto(0) {|limit|
    0.upto(limit - 1) {|i|
      if dup[i] > dup[i + 1]
        tmp = dup[i + 1]
        dup[i + 1] = dup[i]
        dup[i] = tmp
      end
    }
  }
  dup
end

バブルソートの語源

上にまとめた表をよく眺めると、ステップが進むにつれて、大きな値が左から右に移動しています。これを縦に並べて眺めると、丁度コップの中の泡(=バブル)が下から上って行くように見えるところからバブルソートと言われます。

整列 隣接交換法(バブルソート)と選択法(セレクションソート)

なんと!理解した!