-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)

読みやすさとパフォーマンスの両方で、コアのルビ ソート メソッドがカスタム バブル ソートよりも優れていると思います。

于 2013-01-30T13:40:55.173 に答える