我需要使用几种选择枢轴的方法来实现快速排序,因此我实现了一个将枢轴选择器作为参数的例程。但是具体实现的定义包含很多样板,有没有更简洁的方法来定义它们?
private def qsort[a <% Ordered[a]](xs: Stream[a])(choosePivot:Stream[a] => a): Stream[a] = {
if(xs.lengthCompare(1) <= 0) xs
else {
val pivot = choosePivot(xs)
val l = xs.filter(_ < pivot)
val r = xs.filter(_ > pivot)
qsort(l)(choosePivot) ++ pivot#::qsort(r)(choosePivot)
}
}
def qsortHead[a <% Ordered[a]](xs: Stream[a]) = qsort(xs)(ys => ys.head)
def qsortLast[a <% Ordered[a]](xs: Stream[a]) = qsort(xs)(ys => ys.last)
def qsortRandom[a <% Ordered[a]](xs: Stream[a]) = qsort(xs)(ys => ys(rng.nextInt(ys.length)))
qsortHead = qsort head
在 Haskell 中,如果选择枢轴函数是第一个参数还是第二个参数,我可以写一些类似的东西qsortHead xs = qsort xs (\ys -> head ys)
。Scala中有类似的东西吗?