斯卡拉的懒人快艇

Lazy Quicksort in Scala

在scala中可以做这种事情吗?


1
2
3
4
5
6
7
def quicksort[A](xs: Stream[A])(implicit o: Ordering[A]): Stream[A] = {
  import o._
  if (xs.isEmpty) xs else {
      val (smaller, bigger) = xs.tail.partition(_ < xs.head)
      quicksort(smaller) #::: xs.head #:: quicksort(bigger)
  }
}

它也可以用视图来完成,尽管速度肯定会慢得多:

1
2
3
4
5
6
7
8
def quicksort[A](xs: List[A])(implicit o: Ordering[A]) = {
  import o._
  def qs(xs: SeqView[A, List[A]]): SeqView[A, Seq[_]] = if (xs.isEmpty) xs else {
    val (smaller, bigger) = xs.tail.partition(_ < xs.head)
    qs(smaller) ++ (xs.head +: qs(bigger))
  }
  qs(xs.view)
}


对!

scala支持"lazy vals",将值的计算推迟到实际使用为止。scala 2.8库中的大部分都能够处理延迟定义的集合。