Ленивый Quicksort в Scala

Действительно ли возможно сделать этот вид вещи в Scala?

5
задан Community 23 May 2017 в 10:28
поделиться

2 ответа

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)
}
13
ответ дан 18 December 2019 в 14:43
поделиться

Да!

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

0
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: