写泡泡排序更简洁的方式?

时间:2013-01-30 12:06:38

标签: ruby algorithm functional-programming

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

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

有什么想法吗?

1 个答案:

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