繁体   English   中英

Scala功能快速排序

[英]scala functional quick sort

在书的第二章http://www.scala-lang.org/docu/files/ScalaByExample.pdf中 ,M。Odersky写了以下快速排序的实现

def sort(xs: Array[Int]): Array[Int] = {
 if (xs.length <= 1) xs
 else {
 val pivot = xs(xs.length / 2)
  Array.concat(
   sort(xs filter (pivot >)),
   xs filter (pivot ==),
   sort(xs filter (pivot <)))
 }
}

并说:“命令式实现和函数式实现都具有相同的渐进复杂度–平均情况下为O(N log(N))”,但看起来却并非如此,因为我们两次对数组进行了谓词过滤。 在经典命令式版本中,我们对数组使用一个循环。 那么函数实现的运行时间是否为O(N log(N))?

filter本身具有O(n)且O(3n)= O(n),因为3是一个常数因子。 不管n有多大,过滤器只会被调用3次。

编辑 :过滤器被调用3次

Quicksort和许多其他分治算法可以通过最多进行O(n)工作来完成工作,而O(log(n))不会超过数据传递的次数。 在每一步中,我们将数据大致分为两半,这意味着我们确实确实只有log2(n)穿过数据(一个没有被分割的数据,一个被约半分割的数据等等)。

然后,您只需检查每次传递数据所花费的时间不超过O(n)时间。 filter是O(n) ,我们过滤了三次; 加上concatO(n) ,我们执行一次。 因此我们做4*O(n)工作,这是O(n)

由于对同一数据进行所有传递,因此它不是最有效的算法,但顺序正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM