CoffeeScript でマージソート


mergesort.coffee

# 配列をマージソート
mergeSort = (ary, isAsc = true)->
  tmpAry = ary.concat()

  split = (ary)->
    if ary.length < 2
      return ary
    mid = ary.length / 2 | 0
    a = split ary.slice 0, mid
    b = split ary.slice mid, ary.length
    merge ary, a, b
  merge = (ary, a, b)->
    unless b?
      return ary
    c = []
    aK = bK = cK = 0
    while aK < a.length and bK < b.length
      if isAsc ^ a[aK] > b[bK]
        c[cK] = a[aK]
        aK++
      else
        c[cK] = b[bK]
        bK++
      cK++
    c.concat (if a.length <= aK then b.slice bK else a.slice aK)
  split tmpAry