快速排序

D&C

divide and conquer
基线条件:最简单的情况
递归条件:以最快的速度缩小问题规模,使其符合基线条件

归纳证明

基线条件:最简单的情况,比如长度为0或1的数组
归纳条件:证明如果算法对长度为1的数组管用,那么对长度为2的数组也管用;如果对长度为2的数组管用,那么对长度为3的数组也管用;以此类推,证明算法对任意长度的数组都管用。

quicksort

1、处理长度为0或1的数组排序
直接返回数组
2、处理长度为2的数组
比较两个元素,如果第一个元素>第二个元素,交换两个元素位置
3、处理长度为3的数组
选择基准值,分区为两个数组,数组less存放<=基准值的元素;数组greeter存放>基准值的元素
因为数组只包含3个元素,选择1个作为基准值,剩余的元素分区成的两个数组长度肯定<=2,因为quicksort知道如何处理长度<=2的数组,所以可以分别对两个数组进行quicksort
4、处理长度为4的数组
同【3】。分区后的两个数组长度肯定<=3,此时quicksort知道如何处理长度<=3的数组
5、以此类推,证明快速排序算法可以处理任意长度的数组。

快速排序-基线条件

如果数组长度为0或1,直接返回数组

if len(array) < 2: 
    return array

快速排序-递归条件

基准值:选择数组任意元素为基准值,比如第一个元素

pivot = array[0]

分区:遍历数组中其它元素,<=基准值的元素放入数组less;>基准值的元素放入数组greeter

less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]

分别对两个数组进行快速排序

quicksort(less)
quicksort(greater) 

将排序后的两个数组与基准值合并,即为预期的排序结果

return quicksort(less) + [pivot] + quicksort(greater)

快速排序-完整代码

def quicksort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        less = [i for i in array[1:] if i <= pivot]
        greater = [i for i in array[1:] if i > pivot]
        return quicksort(less) + [pivot] + quicksort(greater)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。