Scala 快排

Scala


基本思想:经过一趟排序,把待排对象分成两个独立的部分,一部分的数据大(小)于另一部分,同理,对子对象进行如此处理,以达到所有数据都有序。

 

package student.scala

object Sort extends App {

  def quicksort[T <% Ordered[T]](xs:List[T]):List[T] = {
if(xs.length <= 1 ) xs
else {
quicksort ( xs filter (xs(0) >) ) :::
(xs filter (xs(0) ==) ) :::
quicksort ( xs filter (xs(0) <) )
}
} val rand = scala.util.Random val oriData = for(i <- 1 to 100) yield rand.nextInt(1000) oriData map (_ + " ") foreach print
println
quicksort(oriData.toList) map ( _ + " ") foreach print }

下面是优化版的快排,可以接受更多的类型进行排序,而且返回值与传入值对应。

package student.scala

import scala.collection.SeqLike
import scala.collection.generic.CanBuildFrom object Sort extends App { def quicksort[T <% Ordered[T]](xs: List[T]): List[T] = { if (xs.length <= 1) xs
else {
quicksort(xs filter (xs(0) >)) :::
(xs filter (xs(0) ==)) :::
quicksort(xs filter (xs(0) <))
}
} def sort[T, Coll](xs: Coll)(implicit
ev0: Coll <:< SeqLike[T, Coll],
n: Ordering[T],
cbf: CanBuildFrom[Coll, T, Coll]): Coll = {
if (xs.length < 2) xs
else {
import n._
val b = cbf()
val pivot = xs.head
b ++= sort(xs filter (pivot >))
b ++= xs filter (pivot ==)
b ++= sort(xs filter (pivot <))
b.result
}
} val rand = scala.util.Random
val list = for (i <- 1 to 10) yield rand.nextInt(100) val oriData = list oriData map (_ + " ") foreach print
println
sort(oriData) map (_ + " ") foreach print }

 

Scala快速排序的更多相关文章

  1. Scala第一章学习笔记

    面向对象编程是一种自顶向下的程序设计方法.用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this).行为(方法).和状态(成员变量).识别出名词并且定 ...

  2. Scala极速入门

    摘要 当面向对象遇到函数式编程,这就是Scala.简练的语言描述与简单的例子相辅相成,希望能够对大家学习Scala有所帮助. scala 入门 定义 Scala语言是一种面向对象语言,同时又结合了命令 ...

  3. Scala 实现快速排序和归并排序

    def quickSort1(array: Array[Int]): Array[Int] = { def swap(x: Int, y: Int): Unit = { val tmp = array ...

  4. scala实现快速排序

    scala> def qSort(a: List[Int]): List[Int] = { | ) a | else qSort( a.filter(a.head > _ )) ++ | ...

  5. Scala实现冒泡排序、归并排序和快速排序

    1.冒泡排序 def sort(list: List[Int]): List[Int] = list match { case List() => List() case head :: tai ...

  6. scala实战学习-快速排序

    def qSort(a:List[Int]):List[Int]={ if(a.length < 2) a else qSort(a.filter(a.head > _)) ++ a.fi ...

  7. 【Scala】尾递归优化

    以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么.在函数式编程中,随处可见递归思想的运用.下面给出几个递归函数的例子: object RecursiveExample extends App{ ...

  8. Scala基础语法

    /* 学慕课网上<Scala程序设计>课程跟着敲的代码 作为代码参考也是很好的 在scala_ide.org上下载eclipse IDE,新建一个worksheet,就可以像在xcode的 ...

  9. [原创]Scala学习:数组的基本操作,数组进阶操作,多维数组

    1.Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合 2 声明数组变量: 要使用的程序的数组 ...

随机推荐

  1. android高仿微信UI点击头像显示大图片效果, Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    http://www.cnblogs.com/Jaylong/archive/2012/09/27/androidUI.html http://blog.csdn.net/xiaanming/arti ...

  2. LAMP集群项目五 部署NFS存储服务并设置WEB服务挂载

    yum install nfs-utils portmap -y 在centos6.5中portmap已经改为rpcbind 先启动rpcbind /etc/init.d/rpcbind start ...

  3. js让程序暂停运行的方法

    //自己写的暂停毫秒数的函数 function pauseTime(millTime) { var start=Date.now(); while(true){ var nowTime=Date.no ...

  4. java面向对象、构造方法 之内部类

    UML类图 UML  Unified Modeling Language (UML)又称统一建模语言或标准建模语言 在一个类中      属性表示这类事物的性质(描述它的数据)      方法表示这类 ...

  5. 深入理解Flask中的上下文

    https://blog.csdn.net/barrysj/article/details/51519254 1.AppContext类即是应用上下文,可以看到里面只保存了几个变量,其中比较重要的有: ...

  6. requests设置Authorization

    headers = {"Authorization", "Bearer {}".format(token_string)} r = requests.get(& ...

  7. Solr 整合

    1. Solr 与 Lucene 的区别 Lucene是一个开发源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene 提供了完整的查询引擎 和索引引擎,目的是为软件开发人员提供一个简 ...

  8. MapReduce分区和排序

    一.排序 排序: 需求:根据用户每月使用的流量按照使用的流量多少排序 接口-->WritableCompareable 排序操作在hadoop中属于默认的行为.默认按照字典殊勋排序. 排序的分类 ...

  9. LeetCode题目_Reverse Integer

    最近在LeetCode上做题,写点东西记录一下,虽然自己做的都是些很水的题目,但是重在练手. 题号7:Reverse Integer,题目描述: Reverse digits of an intege ...

  10. 使用渐进式 JPEG 来提升用户体验

    原文出处: 标点符   今天才认识到原来JPEG文件有两种保存方式,分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,扩展名也是相 ...