0
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 行:排序方法中的这 2 行(我无法理解过滤器、++ 和 == 的使用)

sort (a filter (pivot>)) ++ (a filter (pivot == )) ++
 sort (a filter(pivot <))

以及 main 方法中的这一行(我无法理解 n 的用户和 foreach 一词)

sort(a).foreach(n=> (print(n), print (" " )))

我尝试用谷歌搜索这些问题,但没有得到任何帮助。不胜感激,

谢谢

4

1 回答 1

2

这是用函数式编程风格编写的,其中 filter 和 foreach 是高阶函数,即它们将另一个函数作为输入。

主函数中的部分n => (print ... )是匿名函数的语法糖,如下所示:

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进行比较pivota filter (pivot>)然后返回a小于枢轴元素的所有元素的列表。

Scala REPL 中的一个更简单的示例:

scala> List(1,2,3,4,5) filter (3>)
res0: List[Int] = List(1, 2)

我假设你知道快速排序是如何工作的,所以你现在需要把这个拼图的各个部分放在一起就是知道++连接列表,所以你在这些行中执行传统的快速排序:对小于枢轴的元素进行排序,添加枢轴元素,并添加大于枢轴的排序元素。

于 2013-01-09T06:37:58.640 回答