2010-04-22 1 views
5

Возможно ли сделать this вид вещей в Scala?Lazy Quicksort в Scala

+5

ИМХО, вопрос должен быть самодостаточными. Ссылки для более подробной информации в порядке, но ссылка на две строки haskell-кода здесь не будет слишком большой работой. –

ответ

1

Да!

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

+0

это не отвечает на заданный вопрос. –

13
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

Спасибо, но я хотел бы также увидеть реализацию списка-представлений. – Mahesh

+0

@Mahesh Реализация представления оказывается более жесткой, чем я себе представлял. Я буду продолжать пытаться понять, работает ли что-то. –

+0

@Mahesh Хорошо, проблема была сглажена. Я забыл '.head' на линии конкатенации ... Глупо мне. –

 Смежные вопросы

  • Нет связанных вопросов^_^