scala学习(一)--------------------快速排序代码分析

以下是一个scala版的快速排序实现:

object qsort {

  def qsort [T <% Ordered[T]] (list : List[T]) :List[T] = list match {
    case Nil => Nil
    case x :: xs =>
      val (before,after) = xs partition ( _ < x)
      qsort(before) ++ (x :: qsort(after))
  }

  def main(args: Array[String]) {
    val l = List(1,6,2,3,5,10,3,2,1,0,19)
    println(l)
    println(qsort(l))
  }

}


关于这段代码涉及了以下几个内容:

1.'<%'是一个"视图界定" ,这说明qsort接受一个泛型T,这个类型T可以隐式转换成Ordered[T]. Ordered特质在Comparable的基础上额外提供了关系操作符.

视图界定是对泛型类型的一种界定,这里界定为可以隐式转换为Ordered[T]是为了确保类型T可以用<操作符比较。

此外其它的类型界定还有如下几个:

T <: Comparable[T]  T是Comparable[T]的子类型

T >: Comparable[T] T是Comparable[T]的父类型


2.函数接受一个List[T]参数,返回一个List[T]

3.对输入参数list进行模式匹配,这里会调用List[T]对象的unapply方法。

如果是空,返回nil.否则从list中提取出首元素和剩余元素组成的列表分别到x和xs中。

对剩余元素列表调用partition方法,这个方法会将列表分为两部分。划分依据接受的参数,这个参数是一个函数(这里是(_ < x))。partition方法会对每个元素调用这个函数,根据返回的true,false分成两部分。这里'_ < x'是一个匿名函数(又称lambda),'_'关键字是函数输入参数的占位符,输入参数这里是列表中的每个元素。


4.最后对划分好的两部分递归调用qsort.

x::qsort(after)  这里::是List定义的一个方法,用于将两部分合成一个列表。

scala对一些特殊字符规定,如果方法名的最后一个字符是":",则方法调用反转。所以这里实际上是qsort(after).::x




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值