scala风格的插入式排序代码

今天学习《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)
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值