scala学习(一)--------------------快速排序代码分析
2015-04-01 23:22
92 查看
以下是一个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
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
相关文章推荐
- 快速排序的分析及c语言代码
- C代码学习,快速排序,左右并进,递归调用(另注释)
- 经典内部排序算法学习总结(算法思想、可视化、Java代码实现、改进、复杂度分析、稳定性分析)
- 对List进行高效的排序和倒排序代码实战之Scala学习笔记-26
- 【学习逆向工程,分析机器代码】(二)(C++篇)
- OSWorkflow入门学习4--包用途分析及代码片断
- Servlet学习——分析一牛同事的代码
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) 转自CSDN:gushenghua的专栏
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象)
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) -- 转贴自 wolfenstein (NeverSayNever)
- 【学习逆向工程,分析机器代码】(一)(C语言篇)
- BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化)
- JAVA排序算法实现代码-快速(Quick Sort)排序
- 快速排序其他实现代码
- EasyARM2200开发板学习笔记:启动代码分析
- Proxy源代码分析--谈谈如何学习Linux网络编程
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象)
- 随机化快速排序代码
- 数据结构与算法学习记录:快速排序
- C++学习 - 快速排序,更加优化的实现