単純交換ソート
となりの要素が大きければ、となりの要素と交換を繰り返す。
計算量はO(n^2)。
安定的なアルゴリズム。
#最後に入れ替えが発生した場所を記憶しておくことで、 #それより前の場所では入れ替えの必要がないことが分かる。 #今回は実装していない。 def bubblesort!(array) 1.step(array.size - 1, 1) do |i| exchanged = false (array.size - 1).step(i, -1) do |j| if(array[j] < array[j - 1]) then #現在の要素と1つ前の要素を比較し、必要なら入れ替える tmp = array[j - 1] array[j - 1] = array[j] array[j] = tmp exchanged = true end end break unless exchanged #入れ替えが発生していない場合はそれ以上ソートの必要はない end return array end data = Array.new while input = $stdin.gets.to_i break if input < 0 #負数が入力されたら入力の受付を終了する data << input end p data bubblesort!(data) p data