Scala快速排序

时间:2013-01-09 02:59:08

标签: algorithm scala paradigms

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 (" " )))

我试过谷歌搜索这些问题但没有得到帮助。 希望得到答复,

谢谢

1 个答案:

答案 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的排序元素。