Ленивая быстрая сортировка в Скала - PullRequest
5 голосов
/ 22 апреля 2010

Можно ли сделать такие вещи в Scala?

Ответы [ 2 ]

13 голосов
/ 22 апреля 2010
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)
  }
}

Это может быть сделано и с представлениями, хотя это должно быть намного медленнее:

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)
}
0 голосов
/ 22 апреля 2010

Да!

Scala поддерживает "отложенные значения" как способ отложить вычисление значения до его фактического использования. Большая часть библиотеки Scala 2.8 способна работать с лениво определенными коллекциями.

...