如何在Scala中编写“通用”mergesort?

时间:2012-03-24 01:28:36

标签: scala mergesort

这是我到目前为止所做的:

  def mergesort[T <: Ordered[T]](elements : List[T]) : List[T] = {
    def merge(first : List[T], second : List[T]) : List[T] = (first, second) match {
      case (Nil, _) => second
      case (_, Nil) => first
      case (x :: xs, y :: ys) => if (x < y) x :: merge(xs, second) else y :: merge(first, ys)
    }

    if (elements.isEmpty) Nil
    else {
      val length = elements.length
      val (firstHalf, secondHalf) = elements.splitAt(length/2)

      merge(mergesort(firstHalf), mergesort(secondHalf))
    }
  }

我遇到的问题是失败

mergesort(List(1, 3, 6, 3, 1, 0))

error: inferred type arguments [Int] do not conform to method mergesort's type parameter bounds [T <: Ordered[T]]
       mergesort(List(1, 3, 6, 3, 1, 0))
       ^

有没有办法让所有订购的类型都能使用?我虽然Scala会有某种隐式转换为'rich'整数类型,我认为它具有Ordered特征。

1 个答案:

答案 0 :(得分:2)

您需要的是视图绑定def mergesort[T <% Ordered[T]]。请参阅此问题的答案:Generic method to return first of two values

现在可以编译,但是你的算法中有一些错误会在splitAt行中出现堆栈溢出错误。