一、源代码
二、算法的核心
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,这个解释的重点在于“拆分”,而不是排序。换句话说,因为1)是可以被接受的,所以我们要从2)转到1)来给出sort能完成排序。
这是我对快速排序的理解,后面不知不觉就成了证明,当然这不算一个证明。我的目的是传达出快速排序中的递归思想。
def sort(ls: List[Int]): List[Int] = {
ls match {
case Nil => Nil //列表是空列表,返回空列表
case base :: tail => { //不是空列表
val (left, right) = tail.partition(_ < base) //将列表尾部分成比首部元素小的部分和比首部元素大的部分
sort(left) ::: base :: sort(right) //组合成一个新的列表——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,这个解释的重点在于“拆分”,而不是排序。换句话说,因为1)是可以被接受的,所以我们要从2)转到1)来给出sort能完成排序。
这是我对快速排序的理解,后面不知不觉就成了证明,当然这不算一个证明。我的目的是传达出快速排序中的递归思想。