用Scala编写MergeSort

object MergeSort {
  def msort[T](less: (T, T) => Boolean )(xs: List[T]): List[T] = {

    def merge(xs: List[T], ys: List[T]): List[T] = {
      (xs, ys) match {
        case (Nil, _) => ys
        case (_, Nil) => xs
        case (x :: xs1, y :: ys1) =>
          if (less(x, y)) x :: merge(xs1, ys)
          else y :: merge(xs, ys1)
      }
    }

    val n = xs.length / 2;
    if (n == 0 ) xs
    else {
      val (ys, zs) = xs.splitAt(n)    // or "xs splitAt n"
      merge(msort(less)(ys), msort(less)(zs))
    }
  }

  def main(argv: Array[String]): Unit = {
    def compare(left: Int, right: Int): Boolean = {
      left <= right
    }
    val result = msort((x: Int, y: Int) => x < y)(List(9,8,7,6,5,4,3,2,1))
    println(result)
  }
}

摘自 《Programming in Scala》

时间: 2024-10-14 00:27:19

用Scala编写MergeSort的相关文章

scala 编写wordCount

加载文件 scala> var f1=sc.textFile("/tmp/dataTest/followers.txt") scala> f1.flatMap(x=>x.split("-")).map((_,1)).collect //每个数字以'-'分割,并数字为key,给每个key赋值1 res10: Array[(String, Int)] = Array((2,1), (1,1), (4,1), (1,1), (1,1), (2,1), (

Scala编写的打印乘法口诀和金字塔

刚开始接触scala,觉得语法简单,一时兴起就写了两个简单的例子. 1 class Test11 { 2 3 def forTest1(): Unit = { 4 for (i <- 1 to 9) { 5 for (j <- 1 to i) { 6 print(j+"*"+i+"="+i*j+" "); 7 } 8 println(); 9 } 10 } 11 12 def forTest2(a:Int): Unit = { 13

Scala基础语法(声明定义、标识符命名、Scala脚本入门)

一.声明与定义(赋值) 1.val, 常量声明   val x:T val x:T=e 2.var, 变量声明   var x:T var x:T=e ?类型省略(默认类型)val x=e var x=e ? 声明省略(连续声明) val x1,x2,x3 等价于 val x1;val x2; var x1,x2,x3:T=e  等价于  var xn:T=e 3.def,函数声明def abc(xn:T):T*=e def adder(m:Int,n:Int) =m+n def adder()

scala下使用akka计算pi

Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.9999999 % 一年只有 31 ms 宕机. 用akka计算pi,计算公式: 这样,我们把这个公式每连续的elements个分成一段,一共分成message段. 然后开worker个actor同时计算,把结果合并.算出最终结果和耗时. 一:计算某一段的actor 我们需要一个工作actor,用来计算某一段的

scala akka 修炼之路6(scala函数式柯里化风格应用场景分析)

胜败兵家事不期,包羞忍耻是男儿--斗牛士fighting,fighting,fighting... 小象学习和使用scala也一段时间了,最初小象学习scala主要为了学习spark生态,但是深入学习scala的一些特性后,深深被scala函数式和面向对象的风格所折服,不得不赞美设计这门语言的设计者.小象大学阶段在使用MATLAB做数据分析和自动化设计时,就非常喜欢使用MATLAB的命令行和面向矩阵运算的风格编写分析代码:喜欢使用java编写层次化和清晰的模块接口,而这些Scala语言设计中都有

Scala学习1————scala开发环境搭建(windows 10)

Scala开发环境搭建 先讲几点我学习scala的目的或者原因吧: JVM在企业中的霸主地位,Scala也是JVM上的语言,很有可能未来会从Java过度到Scala也不是不可能. 先进的函数式编程和面向对象的结合. 我个人对大数据方面的知识特别感兴趣,发现Kafka和Spark的源码都是scala编写的,而如果我想深入的学习,学习源码可能要用到scala. Spark的生产环境使用Java或者Scala编程似乎是主流,然而开发Spark程序的话使用Java没有使用Scala开发相率高. Scal

Scala学习笔记(一)

.类型参数化数组 val arrayString = Array[String](2); arrayString (0)="Hello"; arrayString (1)="World"; for (i <- 0 to 1){ print(arrayString (i)) } 需要留意上面代码的几个地方如下: 1.无论是在创建数组时的维度指定,还是对数组元素的访问都是使用括号,这里本质上是调用了Array类对应的方法返回的结果完成的操作: 2.scala基本原

Spark:用Scala和Java实现WordCount

为了在IDEA中编写scala,今天安装配置学习了IDEA集成开发环境.IDEA确实很优秀,学会之后,用起来很顺手.关于如何搭建scala和IDEA开发环境,请看文末的参考资料. 用Scala和Java实现WordCount,其中Java实现的JavaWordCount是spark自带的例子($SPARK_HOME/examples/src/main/java/org/apache/spark/examples/JavaWordCount.java) 1.环境 OS:Red Hat Enterp

scala学习手记22 - 参数化类型的可变性

java 的代码中多少有些不是很严谨的内容,比如下面的这段代码: public class Trouble { public static void main(String[] args) { Integer[] arr1 = new Integer[2]; arr1[0] = new Integer(1); Object[] arr2 = arr1; arr2[1] = new Double(2.0); for (Integer i : arr1) { System.out.println(i