【小算法】快速排序

快速排序是一种运用非常广的算法,但不是那么好理解。

假设有下面一组数据,需要从小到大升序排列。

快速排序的算法是

1. 确定不用排序的条件
2. 确定每次排序时,选择排序的基准值(pivot)
3. 排序依据,将当前数组中,所有比 pivot 大的数值存放到新的数组 right 挪到右边,所有比 pivot 小的数值存放到一个新的数组 left 挪到左边,然后一起拼接起来。
4. 利用递归思想,调用快速排序对 left 和 right 数组分别进行排序。

快速排序的过程比较抽象,但其实核心思想就是分治

把复杂的问题分割成若干个同样的简单的问题,也就是化繁为简。

当然,分治思想不仅仅只是运用在快速排序上。

在快速排序中,利用分治,我们可以设定这样的条件。

最简单的问题就是长度为 1 或者为 0 的数组的排序。

因为,它们根本就不再需要排序了。

所以,快速排序就要想尽办法,创造这样的条件。

图例示意:

在这里插入图片描述

每次对一个新的数组排序时,选取一个值作为 pivot,这里选择了第一个。

上图中,第一趟选择了 2 作为 pivot,所以将 1 挪到了左边,6 和 4 挪到了右边。

左边的数组值有 1 ,所以它不需要排序,直接作为返回。

右边的数组有 6 和 4 两个数,所以,它还是要重新排序。

右边的数组需用 6 作为 pivot,那么 4 就挪到 6 的左边。

最终排序的结果就是 1、2、4、6。

快速排序的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)

Python 代码演示:


def quick_sort(arr):

    if len(arr) < 2:
        return arr
    else:
        pivot = arr[0]

        less_arr =[]

        for x in arr:
            if x < pivot:
                less_arr.append(x)

        bigger_arr =[]
        for x in arr:
            if x > pivot:
                bigger_arr.append(x)
    
    return quick_sort(less_arr) + [pivot] + quick_sort(bigger_arr)


if __name__ == "__main__":

    arr = [3,2,8,4,1,6,5]
    print("=======================")
    print(arr)

    result = quick_sort(arr)

    print("=======================")
    print(result)


运行结果如下:

=======================
[3, 2, 8, 4, 1, 6, 5]
=======================
[1, 2, 3, 4, 5, 6, 8]

可以看到,排序结果正确。

时间复杂度

快速排序的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)

这是个平均值。

快速排序最糟糕的情况是算法复杂度是 O ( n 2 ) O(n^2) O(n2)

快速排序会进行多趟,每一趟的时间复杂度是 O ( n ) O(n) O(n),递归调用的次数相当于递归树的层数 O ( l o g n ) O(logn) O(logn),所以总共的复杂度就是 O ( n l o g n ) O(nlogn) O(nlogn)

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frank909

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值