2010-04-22 13 views
5

¿Es posible hacer this tipo de cosa en Scala?Lazy Quicksort en Scala

+5

en mi humilde opinión, una pregunta debe ser autónomo. Los enlaces para obtener más detalles están bien, pero citar dos líneas de código haskell aquí no sería demasiado trabajo. –

Respuesta

1

Sí!

Scala admite "lazy vals" como una forma de diferir el cálculo de un valor hasta que realmente se use. Gran parte de la biblioteca de Scala 2.8 es capaz de trabajar con colecciones definidas de forma diferida.

+0

esto no responde la pregunta. –

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) 
    } 
} 

Se puede hacer con vistas a su vez, a pesar de que está destinado a ser mucho más lento:

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

Gracias, pero me gustaría ver también la implementación de las listas de listas. – Mahesh

+0

@Mahesh La implementación de la vista resulta ser más difícil de lo que había imaginado. Seguiré intentando ver si algo funciona. –

+0

@Mahesh Ok, tengo el problema resuelto. Estaba olvidando el '.head' en la línea de concatenación ... Tonto. –