我最近一直在玩Scala并且正在考虑如何在其中实现一个通用版本的quicksort(只是为了更好地感受语言)
我想出了类似的东西
object Main {
def qs[T](a: List[T], f: (T, T) => Boolean): List[T] = {
if (a == Nil) return a
val (l, g) = a drop 1 partition (f(a(0),(_:T)))
qs(l, f) ::: List(a(0)) ::: qs(g, f)
}
def main(args: Array[String]): Unit = {
val a = List(5,3,2,1,7,8,9,4,6)
val qsInt = qs(_: List[Int], (_: Int) > (_: Int))
println(qsInt(a))
}
}
这不像我想要的那样通用,因为我必须明确说明如何订购元素而不是像
那样做val (l, g) = a drop 1 partition (a(0) >)
如何告诉编译器T只需要实现大于运算符,可以通过这个函数进行排序?
此致
答案 0 :(得分:14)
def qsort[T <% Ordered[T]](list: List[T]): List[T] = {
list match {
case Nil => Nil
case x::xs =>
val (before, after) = xs partition (_ < x)
qsort(before) ++ (x :: qsort(after))
}
}
答案 1 :(得分:8)
自Roger covered Ordered
案件以来,让我了解Ordering
:
def qsort[T](list: List[T])(implicit ord: Ordering[T]): List[T] = list match {
// import ord._ // enables "_ < x" syntax
case Nil => Nil
case x :: xs =>
val (before, after) = xs partition (ord.lt(_, x))
qsort(before) ::: x :: qsort(after)
}
使用Ordering
有两个主要优点:
T
类型不需要创建为Ordered
。例如,在Scala 2.8上:
def sortIgnoreCase(strs: List[String]) = {
val myOrdering = Ordering.fromLessThan { (x: String, y: String) =>
x.toLowerCase < y.toLowerCase
}
qsort(strs)(myOrdering)
}