今天学习《scala编程》这本书,在其中看到了scala代码制作的插入式排序代码。
这段代码我没有测试过,不确定正确性,只是拿出来与大家分享。
def isort(xs : List[Int]) : List[Int] = {
if (xs.isEmpty) Nil
else insert(xs.head, isort(xs.tail))
}
def insert(x : Int, xs : List[Int]) : List[Int] = {
if (xs.isEmpty || x <= xs.head) x :: xs
else xs.head :: insert(x, xs.tail)
}
个人觉得这是一个典型的函数式风格的代码,没有while,通过迭代完成排序
举个例子,List(3,2,1)
第一次调用isort,
insert(3,isort(list(2,1)))
此时栈内容:
insert
isort
第二次调用isort,insert压栈
insert(2,isort(list(1)))
此时栈内容:
isort
insert
isort
第三次调用isort,insert在此压栈
insert(1,isort(list()))
此时的list为空了,触发了xs.isEmpty条件,递归开始返回
以上是我的个人分析,仅仅是理论的,这个代码最终还是需要经过测试,才能验证其正确性和可靠性
补充:采用模式匹配的方式完成insertSort
def isort(xs : List[Int]) : List[Int] = xs match {
case List() => List()
case x :: xsl => insert(x, isort(xsl))
}
def insert(x : Int, xs : List[Int]) : List[Int] = xs match {
case List() => List(x)
case y :: ys => if (x < y) x :: xs
else y :: insert(x, ys)
}