是否有更简洁的方法使用冒泡排序算法实现按元素大小编写数组排序方法?我不是在寻找速度优化,只是为了更紧凑的代码,首选的功能风格。
def sort_by_size(arr)
# bubble sort
(arr.length - 1).downto 1 do
|ix|
arr = arr[1..ix].inject([[],arr[0]]) {|(ac,g),e| g.size < e.size ? [ac << g, e] : [ac << e, g]}.flatten.concat(arr[ix+1..-1])
end
arr
end
有什么想法吗?
答案 0 :(得分:1)
我这样做:
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排序方法在可读性和性能方面都胜过我的自定义冒泡排序。