`

Scala排序简写及效率

 
阅读更多

下面2段代码基本来自《Scala By Example》一书

 

正常的写法:(scala写的,但逻辑与实现和传统的JAVA排序一致)

 

 

def sort(xs: Array[Int]){

    def swap(i:Int, j:Int){
      val t = xs(i); xs(i) = xs(j); xs(j) = t
    }

    def sort1(l: Int, r: Int){
      val pivot = xs((l + r)/2)
      var i = l; var j = r;
      while (i <= j){
        while (xs(i) < pivot) i += 1
        while (xs(j) > pivot) j -= 1
        if(i <= j){
          swap(i, j)
          i += 1
          j -= 1
        }
      }
      if(l < j) sort1(l, j)
      if(j < r) sort1(i, r)
    }
    sort1(0, xs.length - 1)
  }

 

Scala中的漂亮写法:

 

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

 

单从视觉效果上看,第二种写法绝对是精妙绝伦,排除了传统JAVA实现中的i+=1,j+=1这种缺乏直观理解的逻辑,采用filter过滤合适数据进行迭代。

 

本来我就要被书上这种漂亮的写法诱惑了,大有往后就贴近这种风格来写的冲动,但忍不住测试了下效率让我大跌眼镜:

 

采用具有16个随机数的Array测试。

当用System.currentTimeMillis()计时

 

时间1:0

时间2:17

 

第一种方法居然用毫秒都无法记录到时间?那就逼迫我们用nanoTime()来计时了:

 

时间1:11974

时间2:17514962

 

居然差了3个数量级= =

这就是漂亮代码的代价么。。。

 

大体上看来,第二种方式之所以慢应该是filter造成的,咱们可爱的filter每次都遍历集合,因此第二种方法并没有根据已排序的数据来减少后续的排序元素数量,每次都全部遍历自然效率比较低。

 

0
1
分享到:
评论

相关推荐

    快学scala习题及答案详解

    这个压缩包文件"快学scala习题及答案详解"显然是为学习Scala的人设计的,提供了逐步学习和自我测试的资源。通过章节习题和答案,学习者可以深入理解Scala的核心概念和技术。 首先,我们从标题中可以看到,这是一套...

    Programming In Scala 中文版及英文版

    **标题与描述解析** 《Programming In Scala》是一本权威的Scala编程语言教程,它由Martin Odersky(Scala的创造者...通过深入学习和实践,开发者能够掌握Scala的精髓,运用到实际项目中,提升软件开发的效率和质量。

    scala语言教程及规范

    然而,Scala引入了许多创新特性,如模式匹配、高阶函数、匿名函数、类型推断和特质(trait)等,这些都极大地提高了编程的灵活性和效率。 1. **类型系统**:Scala具有强大的类型系统,支持静态类型和类型推断。这...

    Scala实操教程及演示

    ### Scala 实操教程及演示知识点总结 #### 一、Scala简介 Scala是一种多范式编程语言,融合了面向对象和函数式编程的特性。在大数据处理领域,尤其是Apache Spark项目中,Scala因其强大的功能和灵活性而被广泛采用...

    scala sdk scala-2.12.3

    Scala-2.12.3是Scala的一个特定版本,它包含了对Java 8及更高版本的支持,并提供了性能优化和新功能。 Scala SDK主要包括以下组件: 1. **编译器**:Scala编译器将Scala源代码转换为Java字节码,使得程序可以在...

    scala3 scala3 scala3 scala3 scala3

    Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    Scala实现冒泡排序、归并排序和快速排序的示例代码

    Scala实现冒泡排序、归并排序和快速排序的示例代码 本文主要介绍了Scala实现冒泡排序、归并排序和快速排序的示例代码,这些示例代码可以帮助读者更好地理解这些排序算法的实现细节。 冒泡排序是一种简单的排序算法...

    scala2.12.1Windows镜像包

    - **JVM兼容性**:Scala 2.12.x主要针对Java 8及更高版本进行优化,充分利用了JVM的新特性,如Lambda表达式和Stream API。 - **互操作性**:Scala可以直接调用Java库,反之亦然,这得益于良好的Java互操作性。 - ...

    scala-2.12.10.zip

    Scala 2.12.x系列是该语言的一个稳定版本,它提供了许多新特性和改进,旨在提高开发人员的效率和代码的可维护性。 在Scala 2.12.10中,主要关注点包括性能提升、对Java 8的更好支持以及对JVM的优化。这个版本引入了...

    scala + mybatis 数据库查询

    - 虽然MyBatis已经具有很好的性能,但我们仍然可以通过缓存、批处理和预编译SQL等方式进一步提升查询效率。 - 使用Scala的惰性计算和集合优化,可以在不影响代码可读性的情况下提高性能。 通过以上步骤,我们可以...

    Scala考试题1

    Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...

    scala-2.12.6.tgz

    Scala由Martin Odersky在2003年设计,其名称来源于"Scalable Language"的缩写,旨在提供一个高效、灵活且可扩展的编程平台。它的语法简洁,支持高阶函数、模式匹配、匿名函数、类型推断等特性,使得代码更加简洁和...

    Scala 高级编程及实例

    ### Scala高级编程及实例知识点概览 #### 一、引言 Scala是一种融合了面向对象与函数式编程特性的现代编程语言。它旨在提供一种简洁、优雅且类型安全的方式来表达常见的编程模式。Scala的设计考虑到了现代软件开发...

    scala-2.13.0-M5.tgz

    Scala的名字本身就是“Scalable Language”(可扩展语言)的缩写,它在Java虚拟机(JVM)上运行,并能够与Java代码无缝集成。 Scala-2.13.0-M5是Scala语言的一个预发布版本,代表了其在2.13主分支上的第五个里程碑...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...

    scala-intellij-bin-0.41

    总的来说,"scala-intellij-bin-0.41"插件极大地提升了IntelliJ IDEA作为Scala开发环境的效率和舒适度,让开发者能够更加专注于代码逻辑,而非语言环境的配置。在实际开发中,安装并熟练使用这样的插件是提升生产力...

Global site tag (gtag.js) - Google Analytics