単純挿入ソート
2番目の要素から先頭に向かって適当な位置に挿入をしていく。
計算量はO(n^2)。
最良時はそれぞれの要素が適当な位置に収まっていることを確認するためのO(n)。
ソート済みの部分が多いときは高速だが、要素を1つずらすコストが高い。
したがって、ランダムな要素については性能が出ないが、
ソート済み要素に対する性能が高く、かつ安定的という性質を持つ。
(要素をずらすコストについては、ライブラリに配列をずらす関数が用意されている場合、
コンパイラによる最適化が働く(ポインタ使用)場合で性能が向上する。)
#挿入のため要素を1つずらすコストが高い #大まかにシャトルソートを行うことで交換回数を減らすのがシェルソートになる def shuttlesort!(array) 1.step(array.size - 1, 1) do |i| target = array[i] insertion = nil; i.step(0, -1) do |j| insertion = j if array[j - 1] < target then break end array[j] = array[j - 1] end array[insertion] = target end end data = Array.new while input = $stdin.gets.to_i break if input < 0 data << input end p data shuttlesort!(data) p data