私はこのようにします:
def sort_by_size!(a)
loop do
swapped = false
a.size.times do |n|
if a[n].size < a[n-1].size
a[n], a[n-1] = a[n-1], a[n]
swapped = true
end unless n == 0
end
break unless swapped
end
array
end
ここでの主なアプローチは読みやすさです。array.sort_by! { |e| e.size }
またはarray.sort!
(ほとんどの場合)同じ仕事をします。パフォーマンスが気になる場合 (またはそうでない場合) は、いくつかのベンチマークがあります。
n = 100_000
Benchmark.bmbm do |x|
x.report('my bubble sort') { n.times { sort_by_size! array.dup } }
x.report('your bubble sort') { n.times { sort_by_size array.dup } }
x.report('sort_by!') { n.times { array.dup.sort_by! { |e| e.size } } }
x.report('sort') { n.times { array.dup.sort! } }
end
user system total real
my bubble sort 0.200000 0.000000 0.200000 ( 0.196077)
your bubble sort 0.520000 0.000000 0.520000 ( 0.524635)
sort_by! 0.090000 0.000000 0.090000 ( 0.092452)
sort 0.030000 0.000000 0.030000 ( 0.024854)
読みやすさとパフォーマンスの両方で、コアのルビ ソート メソッドがカスタム バブル ソートよりも優れていると思います。