我会这样做:
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)
我认为核心 ruby 排序方法在可读性和性能方面都胜过我的自定义冒泡排序。