【和我一起学算法】排序篇——快速排序

往期推荐:


【和我一起学算法】排序篇——冒泡排序

【和我一起学算法】排序篇——选择排序

【和我一起学算法】排序篇——插入排序

【和我一起学算法】排序篇——归并排序

这期讲快排,即快速排序,快速排序也是一种递归排序,是一种用简单方法来解决困难问题的典型案例,缺点是有点浪费空间。

目录

五、快速排序

原理

举例

第一次分组

 第二次分组

第三次分组

第一次合并

第二次合并

第三次合并

源码


五、快速排序

原理

快速排序是选择列表中任意一个数为基准,我们通常选用列表中的第一个数,将列表分为左右两个子序列,左边的子序列存放比基准小的数,右边存放比基准大的数。然后再把左边子序列和右边子序列按照同样的方法进行分解、比较,一直到分无可分为止;然后再按照左边子列表(比基准数小)+基准数+右边子列表(比基准数大)的公式将数字连接起来,最后就能得到一个完整有序数列。

举例

还是以我们的数列[7,3,5,1,9,4]为例。

第一次分组

首先以第一个数7为基准数,分为左右两个子序列,左边子序列比基准数7小,分别为[3,5,1,4],右边子序列比基准数7大为[9]。

第一次分组
左边子序列3514基准数7右边子序列9

 第二次分组

右边子序列只有一个数字,说明已经划分到了最小单元,可以不用划分了,之后的分组也不用考虑这个右边子序列[9]了。

左边子序列在按照左+基准+右的公式来划分;基准数为左边子序列的第一个数字3,我们根据算法思想得到一下划分结果:

第二次分组
左边子序列1基准数3右边子序列54

第三次分组

这次的左边子序列只剩一个元素了,不用划分我们看右边子序列,右边子序列元素个数为2,需要继续划分。

以右边子序列第一个元素5为基准,进行划分,划分结果如下:

第三次分组
左边子序列4基准数5

现在所有序列都已经划分完毕了,我们可以按照公式给它们合并起来了。

第一次合并

第一次合并
左边子序列4基准数5

左边子序列+基准数+右边子序列=[4]+[5]+[ ];

合并结果为[4,5]

第二次合并

第二次合并
左边子序列1基准数3右边子序列45

左边子序列+基准数+右边子序列=[1]+[3]+[4,5];

合并结果为[1,3,4,5]

第三次合并

第三次合并
左边子序列1345基准数7右边子序列9

左边子序列+基准数+右边子序列=[1,3,4,5]+[7]+[9];

合并结果为[1,3,4,5,7,9]

快速排序结束。

快速排序算法最坏情况下的时间复杂度为O(n^2)

源码

QuickSort.py

from randomList import randomList
import timeit

iList = randomList(20)

def quickSort(iList):
    if len(iList) <= 1:
        return iList
    left = []
    right = []
    for i in iList[1:]:
        if i <= iList[0]:
            left.append(i)
        else:
            right.append(i)
    return quickSort(left) + [iList[0]] + quickSort(right)

if __name__ == "__main__":
    print(iList)
    print(quickSort(iList))
    print(timeit.timeit("quickSort(iList)", "from __main__ import quickSort,iList", number=100))

明天讲计数排序,一起加油鸭~

欢迎点赞、关注、收藏~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二琳爱吃肉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值