object MergeSort { def msort[T](less: (T, T) => Boolean)(xs: List[T]): List[T] = { def merge(xs: List[T], ys: List[T]): List[T] = { (xs, ys) match { case (Nil, _) => ys case (_, Nil) => xs case (x :: xs1, y :: ys1) => if (less(x, y)) x :: merge(xs1, ys) else y :: merge(xs, ys1) } } val n = xs.length / 2; if (n == 0 ) xs else { val (ys, zs) = xs.splitAt(n) // or "xs splitAt n" merge(msort(less)(ys), msort(less)(zs)) } } def main(argv: Array[String]): Unit = { def compareFunc(left: Int, right: Int): Boolean = { left <= right } // 也可以换一种写法 // val result = msort(compareFunc, List(9,8,7,6,5,4,3,2,1)) // 但是这样的话要把 msort 的 声明改成 // def msort[T](less: (T,T) => Boolean, xs: List[T]): List[T] = {...} val result = msort(compareFunc)(List(9,8,7,6,5,4,3,2,1)) println(result) } }
摘自《Programming in Scala》