object QuickSort {
def main(args: Array[String]) = {
val a = Array(5, 3, 2, 1, 20, 46, 9, 39 ,219)
sort(a).foreach(n=> (print(n), print (" " )))
}
def sort(a:Array[Int]): Array[Int] = {
if (a.length < 2) a
else {
val pivot = a(a.length / 2)
sort (a filter (pivot>)) ++ (a filter (pivot == )) ++
sort (a filter(pivot <))
}
}
}
首先,我正在做一项任务,我应该在Scala中解释各种排序算法。我对Scala比较陌生。我已经离开了另一个帖子,我得到了回答,它帮助了我。我的问题是这3行: 排序方法中的这两行(我无法理解过滤器的使用,++和==)
sort (a filter (pivot>)) ++ (a filter (pivot == )) ++
sort (a filter(pivot <))
和主方法中的这一行(我无法理解n的用户和术语foreach)
sort(a).foreach(n=> (print(n), print (" " )))
我试过谷歌搜索这些问题但没有得到帮助。 希望得到答复,
谢谢
答案 0 :(得分:2)
这是以函数式编程风格编写的,其中filter和foreach是高阶函数,即它们将另一个函数作为输入。
使用n => (print ... )
的main函数中的部分是匿名函数的语法糖,如下所示:
def someName(n : String) = (print ...)
foreach
依次将此函数应用于列表的每个参数。请注意,使用n => ...
编写它的简短方法允许您保存def someName
以及键入参数n
的需要,因为编译器自动导出它必须是String
论证。
同样,pivot >
,pivot <
和pivot ==
只是用于编写表单函数的语法糖
def gt(arg : String) = pivot > arg
再次,filter
将此函数应用于列表的每个参数,并从这些参数构建结果列表,此函数返回true
。
换句话说,(a filter (pivot>))
执行以下操作:将列表a
的元素与pivot
元素进行比较,然后a filter (pivot>)
返回所有元素的列表a
小于pivot元素。
Scala REPL的一个更简单的例子:
scala> List(1,2,3,4,5) filter (3>)
res0: List[Int] = List(1, 2)
我假设你知道quicksort是如何工作的,所以你现在需要把这个难题的各个部分放在一起就是知道++
连接列表,所以你在这些行中执行传统的快速排序:对那些元素进行排序小于pivot,添加pivot元素,并添加大于pivot的排序元素。