2010-04-22 6 views
5

Est-il possible de faire this genre de chose à Scala?Quicksort paresseux dans Scala

+5

à mon humble avis, une question doit être autonome. Liens pour plus de détails sont d'accord, mais citant deux lignes de code haskell ici ne serait pas trop de travail. –

Répondre

1

Oui! Scala prend en charge les "valses paresseuses" comme un moyen de reporter le calcul d'une valeur jusqu'à ce qu'il soit réellement utilisé. Une grande partie de la bibliothèque Scala 2.8 est capable de travailler avec des collections définies paresseusement.

+0

cela ne répond pas à la question posée. –

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

Il peut être fait avec des vues aussi bien, mais il est lié à être beaucoup plus lent:

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

Merci, mais j'aimerais aussi voir l'implémentation des vues de liste. – Mahesh

+0

@Mahesh L'implémentation de la vue s'avère plus difficile que je ne l'imaginais. Je vais continuer à essayer de voir si quelque chose fonctionne. –

+0

@Mahesh Ok, j'ai réglé le problème. J'oubliais le '.head' sur la ligne de concaténation ... Silly me. –