マージソート続き

ブロックが渡せなかった理由

ブロックがうまく渡せなかった理由は、関数をネストしていたからみたい。
どうしてそうなるかは追えてない(あとで調べる)

速度向上。

コードを見ていると、意味もなく何回もlambda(もしくはunless)が呼ばれている。*1これを外に出してしまえば、もう少し早くなるかもしれない。
ということでコードを修正

class Array
 def merge_sort2(a=self,&block)
    cond = lambda { |a,b| a <= b} unless block
    m_s(a,&cond)
  end
  def m_s(a,&cond)
    return a if a.size <= 1
    #ブロックの部分の記述削除
    ...
  end

  def merge(left,right,&cond)
    ...
  end
end

結果

        user     system      total        real
ms2   1.080000   0.190000   1.270000 (  1.272517)
ms    1.650000   0.230000   1.880000 (  1.880838)

少し早くなった。

*1:cond = lambda { |a,b| a <= b} unless blockの部分