Scala快速排序算法解析

一、源代码
def sort(ls: List[Int]): List[Int] = {
ls match {
case Nil => Nil //列表是空列表,返回空列表
case base :: tail => { //不是空列表
val (left, rigth) = tail.partition(_ < base) //将列表尾部分成比首部元素小的部分和比首部元素大的部分
sort(left) ::: base :: sort(rigth) //组合成一个新的列表——sort(比首部小的部分)+首部+sort(比首部大的部分)
}
}
}
二、算法的核心
1)快速排序事先选取一个元素作为用来比较的基准。比基准大的数放在右边,比基准小的数放在左边,一次分成大、小两类。
2)每一类又通过选取一个基准再次进行大小的分类。直到左右两边没有数据为止。
三、递归的解释
理解递归的关键在于先接受它。我们事先暗示自己“sort函数能够对输入的列表进行排序”。
按照这种暗示,我们进入sort函数体内,分成两种情况
1)如果传入的是Nil,则返回Nil——没错,sort对Nil进行的排序。
2)如果传入的不是Nil,sort会将列表ls分解成两个部分left和right,实际上还有首部tail。然后返回一个列表——这个列表由排序过的left+首部base+排序后的right。当然sort方法实现了它的承诺,返回的列表是排过序的。
先不要庆幸理解了快速排序,在这之后我们需要跳出这个暗示,说服自己为什么2)中的sort能够完成排序(这时候要把内部的自身调用看成另外一个函数)
合理的解释是sort能够把传入列表拆分成左右两个部分,然后使用一个拆分函数继续拆分,直到为Nil。这里的拆分函数还是sort,这个解释的重点在于“拆分”,而不是排序。换句话说,我们要从2)转到1)。现在2)过程能转到1),而1)是可以被接受的。所以,这个递归方式是成立的。
其实,我只是想表述,看到sort排序的时候自己心里是如何想的,后面不知不觉就成了证明,当然这不算一个证明。我的目的是让你从上面的描述中感受到递归的思想。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值