`
vwpolo
  • 浏览: 194766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Scala 的快速排序

阅读更多

   真的越来越喜欢Scala了,简洁的语法,清新的风格是我对Scala的印象,感觉使用Scala进行编程真的非常的方便,从Scala的设计思想也能得到不少的启发,就比如下面的一个对数字数组快速排序的sort(Array[Int])方法,你以前想到过通过这样的方式实现吗?

 

/**
 * 快速排序的例子2
 * @author VWPOLO
 * <p>2009-8-12</p>
 */
object TestQuickSort2 {
  def main(args : Array[String]) : Unit = {
    var arrays = Array(123,343,5435,23,3213);
    println("排序前的结果");
    arrays.foreach(println) 
    arrays = sort(arrays);
    println("排序后的结果");
    arrays.foreach(println) 
  }
  
  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 <))
      )
    }
  }
}

 

   sort(Array[Int])方法通过简明的方式完成了传统的快速排序功能:

      1、判断参数数组是否为空?如果为空说明排序完成,直接方法参数。

      2、如果给定的参数数字不为空,取得数组的中间数。

      3、根据中间数对参数数组进行拆分:调用Arrayfilter(pA => Boolean)方法对数组进行分区并生成一个新的数组,"xs filter (pivot >)生成一个新的数组只包含小于pivot的数字,"xs filter (pivot ==)"里面的数组只包含等于pivot的数组,"xs filter (pivot <)"则包含大于pivot的数字,通过sort方法的迭代,完成了排序过程。

      4、通过Array.concat方法合并多个数组,返回排序后的结果就行了<!--endfragment-->


    sort方法指定了返回值但是方法块中没有"return" 语言,其实加不加都无所谓,Scala编译器可以自动进行判断。

<!--endfragment-->

    这种方式和传统的快速排序方法在时间复杂度和空间复杂度相似,但是代码却大大的简化了,不信你用Java写一个对数字数组快速的排序方法(要自己写,使用Collections.sort(List<T>)方法可不算啊)。

    Scala引起了大家的大量关注,一些人拿Scala的缺点和Java的优点进行比较进行批评Scala"另一些人拿Java缺点和Scala优点进行比较来拥护Scala,然后两队人在论坛上打起了口水仗,因为Scala又不是钞票,当然不能够取悦所有人。

分享到:
评论
10 楼 fineqtbull 2009-10-18  
支持博主对Scala的看法。
欢迎到Scala圈子来看看
9 楼 smiletuna 2009-09-16  
vwpolo 写道
不过Scala在国内的应用好象没有活跃起来,


本来scala也没出来多久,怎么期待能很火爆呢。

erlang, python这些历史都不比java短, 但是流行程度和java比又是另外一回事了。
8 楼 vwpolo 2009-09-09  
不过Scala在国内的应用好象没有活跃起来,
7 楼 night_stalker 2009-09-08  
话说那个 qsort 写法应该是来自 haskell
qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)


在 ruby 看起来就是这样
def sort a
  return a if a.size <= 1
  pivot = a[0]
  sort(a.select{|x| x < pivot}) +
       a.select{|x| x == pivot} +
  sort(a.select{|x| x > pivot})
end

6 楼 night_stalker 2009-09-08  
……

implicit def Array2ArrayEx [T <% Ordered[T]] (a: Array [T]) = new {
  def sort = {
    scala.util.Sorting quickSort a
    a
  }
}


println(Array("hello","123","no").sort.toString)
println(Array(123,343,5435,23,3213).sort.toString)
5 楼 leisure 2009-09-08  
scala确实不错
4 楼 fxsjy 2009-09-01  
netbeans的scala插件,应该是目前最好用的。
3 楼 wangxin0072000 2009-09-01  
请问有什么比较好的IDE或者什么编辑器吗?是在不习惯在notepad上写代码。
2 楼 advantech 2009-08-15  
我现在力挺Scala,更力挺Scala和Java的混合编程,各取其精华。
1 楼 icefishc 2009-08-13  
有个小错误
引用
这种方式和传统的快速排序方法在时间复杂度和空间复杂度相似

这么做的空间复杂度要比原先多得多.  嘿嘿

一般的QuickSort的递归实现已经很简单的了
如果一定要说说有什么麻烦的地方那就是它的partition部分 (实际上你简化的也就是那部分) 呵呵

但那个inplace的partition实在很精彩 扔掉不合适



相关推荐

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

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

    scala-sorts:scala中的排序算法

    5. **快速排序(Quick Sort)**:采用分治策略,选取一个“基准”元素,将数组分为小于和大于基准的两部分,然后对这两部分递归排序。平均时间复杂度为 O(n log n),但最坏情况为 O(n^2)。空间复杂度为 O(log n)。 ...

    Scala数据结构和算法.docx

    9. **算法实现**:Scala可以实现各种经典算法,如排序(快速排序、归并排序)、查找(二分查找)、图算法(深度优先搜索、广度优先搜索)等。 10. **泛型**:Scala的泛型系统允许创建类型安全的通用代码,能够处理...

    scala程序员面试算法宝典代码

    - 冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序:这些是常见的排序算法,理解它们的原理和性能至关重要。 - 二分查找:在已排序的数组中查找特定元素,具有O(log n)的时间复杂度。 - 哈希查找:...

    scala版DVD管理系统

    4. **高阶函数**:Scala的高阶函数使得可以将函数作为参数传递,这在实现通用操作如排序、过滤或映射DVD列表时非常有用。 5. ** Trait **:Scala的Trait类似于Java的接口,但可以包含实现。可能定义了`DvdManager` ...

    Data Structures and Algorithms with Scala

    常见算法包括排序(如冒泡排序、选择排序、快速排序、归并排序等)、搜索(如线性搜索、二分搜索)、图算法(如深度优先搜索、广度优先搜索)、动态规划等。掌握算法能帮助我们编写更高效、更优雅的代码。 本书可能...

    Scala编程详解 第9讲-Scala编程详解:数组操作之Array、ArrayBuffer以及遍历数组 共7页.pptx

    例如,数组元素求和可以使用`sum`方法,最大值通过`max`获取,快速排序可以借助`scala.util.Sorting.quickSort`,而将数组转换为字符串可以用`mkString`,如: ```scala val a = Array(1, 2, 3, 4, 5) val sum = a....

    Scala 高级编程及实例

    这一部分将帮助初学者快速上手Scala,并通过实践加深理解。 #### 三、使用Actor与消息进行编程 本章节介绍了如何利用Actor模型来进行并发编程。Actor是一种用于构建高度可伸缩和容错系统的方法,它基于消息传递来...

    Spark常用的算子以及Scala函数总结.pdf

    Apache Spark 是一个开源的分布式计算系统,提供了一个快速、通用的引擎,用于大规模数据处理。它是一个基于内存计算的大数据处理框架,拥有强大的数据处理能力。Spark 基于 Scala 语言构建,支持多种编程语言接口,...

    Algorithm-algorithms-scala.zip

    在"algorithms-scala-master"中,可能包含排序算法(如快速排序、归并排序、冒泡排序)、搜索算法(如线性搜索、二分搜索)、图算法(如Dijkstra最短路径算法、Floyd-Warshall算法)、动态规划问题的解决方案、字符...

    Scala-简易详解文章

    `foreach`遍历集合,`distinct`去除重复元素,`map`和`flatMap`进行转换,`filter`筛选元素,`sorted`、`sortBy`和`sortWith`排序,`groupBy`按指定条件分组,`reduce`和`fold`进行聚合,`collect`根据模式匹配转换...

    手写程序(scala).docx

    快速排序算法在Scala中的实现 快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以...

    solr-scala-client:Scala的Solr客户端

    5. **处理结果**:对查询结果进行遍历、过滤或排序,以满足应用程序的需求。 6. **关闭连接**:完成所有操作后,记得关闭`SolrClient`实例,释放资源。 **三、Solr与Scala的结合优势** 1. **类型安全**:Scala的...

    响应式架构++消息模式Actor实现与Scala.Akka应用集成+,沃恩·弗农+

    响应式架构是一种设计思想,旨在构建能够快速适应变化的系统,包括处理来自用户或环境的事件,以及在资源有限的情况下保持高效性能。这种架构风格强调响应能力、弹性、容错性和资源意识,常用于分布式系统和实时应用...

    Scala 【 5 数组常见操作和 Map 】

    快速排序算法用于对数组进行排序。 5. **获取数组元素内容**: ```scala a.mkString // 默认使用逗号分隔 a.mkString(",") // 指定分隔符 a.mkString("") // 不使用分隔符 a.toString // 转换为字符串形式 `...

    scala-algorithms:为了(重新)学习,练习经典排序算法的实现

    快速排序是一种分治策略,通过选取一个基准元素并分区,将数组分为两部分,分别对两部分进行排序。Scala中,递归和尾递归优化是关键。 5. 归并排序(Merge Sort) 归并排序将数组分为两半,分别排序,然后合并。...

    scalaprops:Scala的基于属性的测试库

    例如,如果有一个排序算法,那么其属性可能包括“对于任何输入列表,排序后总是得到一个递增的列表”。 **Scalaprops的功能与特点** 1. **随机数据生成**:Scalaprops使用伪随机数生成器(PRNG)来生成测试用例,这...

    functional-programming-scala:Scala中的函数式编程示例

    快速排序 泡泡排序 合并排序 选择排序 ## Type类 Scala具有支持临时多态性的“类型类”。 我不确定此功能与支持函数式编程的Scala是否相关,但是看起来它是一种使用非常广泛的功能。 这是一个使用上下文边界的类型类...

    matlab判断为整数代码-sortingComparison:在Scala,Clojure和Java中实现的不同排序算法,以及时间和样式的比

    快速排序 7 20 10 合并排序 5 27 4 编译java部分 javac Main.java 编译scala部分 scalac Main.scala quicksort/Sort.scala mergesort/Sort.scala bubblesort/Sort.scala 回购的主要分支具有主要功能,该功能运行各种

Global site tag (gtag.js) - Google Analytics