-2

有没有更简洁的方法来使用冒泡排序算法实现按元素大小编写数组排序方法?我也不是在寻找速度优化,只是为了更紧凑的代码,首选功能风格。

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

任何想法 ?

4

1 回答 1

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​​ 排序方法在可读性和性能方面都胜过我的自定义冒泡排序。

于 2013-01-30T13:40:55.173 回答