Lazy Quicksort in Scala
在scala中可以做这种事情吗?
- imho,一个问题应该是独立的。有关更多细节的链接是可以的,但是在这里引用两行haskell代码不会有太多工作。
1 2 3 4 5 6 7
| 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 )
}
} |
它也可以用视图来完成,尽管速度肯定会慢得多:
1 2 3 4 5 6 7 8
| 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)
} |
- 谢谢,但我也希望看到列表视图的实现。
- @Mahesh视图的实现比我最初想象的要困难。我会一直试着看看有没有什么效果。
- @马赫什好了,把问题解决了。我忘了连接线上的.head…愚蠢的我。
- @丹尼尔:我们可以用quicksort[A <% Ordering[A]](xs: List[A]) = {替换第一行吗?
- @Aymen和Ordering不像Ordered那样灵活。除此之外,是的,在第二行去掉import。
- @丹尼尔:我不认为Seqview一号是懒惰的。把一个柜台插进去看看。
- 在哪里可以找到#:::操作员的文档?
- @布莱恩看索引。
- 为什么不在stream.scala(和seqview)中使用这种懒惰的类型(或类似的类型)来实现sorted、sortBy、sortWith等。是吗?是否有任何方法可以只使用库内置函数进行惰性排序?sorted不是"变压器吗?"文档说流"延迟地实现了它的所有Transformer方法",但据我所知,这里似乎不是这样?
- @Brian这不是实现,因为没有人编写它,没有人提交它,也没有人要求它。有人可能会说,sorted是一种变换方法,但我猜想只有变换值被认为是变换值的方法。
对!
scala支持"lazy vals",将值的计算推迟到实际使用为止。scala 2.8库中的大部分都能够处理延迟定义的集合。