快速排序,《学点算法吧,Python》

快速排序

1、概念及其介绍

快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2、适用说明

快速排序是一种比较快速的排序算法,它的平均运行时间是 O(nlogn),之所以特别快是由于非常精练和高度优化的内部循环,最坏的情形性能为 O(n^2)。快速排序是一种分治的递归算法。从空间性能上看,快速排序只需要一个元素的辅助空间,但快速排序需要一个栈空间来实现递归,空间复杂度也为O(logn)

快速排序的最坏运行情况是 O(n²)。但它的平摊期望时间是 O(nlogn),且 快速排序的O(nlogn) 记号中隐含的常量很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。

所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。


快速排序算法步骤

  1. 从数列中挑出一个元素,称为 "基准";
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

我们选择序列的第一个值为基准,如图:

最糟糕的情况

快速排序的最坏运行情况是 O(n²),它是指我们每次选择的‘基准’都是最大或者最小值,不能对序列进行分段,相反最理想的状况是‘基准’可以将序列平均分成两段,这样我们就能通过较少的分段次数完成排序。


快速排序Python实现

 先上序列,生成随机序列:

import random

def ord_list(n):
    ord = list(range(n))
    return ord
def ran_list(n):
    ran = ord_list(n)
    random.shuffle(ran)
    return ran

排序代码:

def quickSort(list):
    #递归终止条件:元素只有一个或者为空
    if len(list)<2:
        return list
    else:
        pivot=list[0]#选择基准值,也可以通过其他方式确定基准值
        left = [u for u in list[1:] if u<=pivot]#生成左侧序列
        right = [u for u in list[1:] if u>pivot]#生成右侧序列
    return quickSort(left)+[pivot]+quickSort(right)#递归排序,先左侧序列后右侧序列依次递归,最后+运算为新的序列

看看效果:

if __name__=='__main__':
    test_list =ran_list(10)
    print(test_list)
    final_list=quickSort(test_list)
    print(final_list)

'''
输出如下:
[1, 3, 4, 2, 9, 5, 6, 0, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''

总结

这个算法没什么难度,如果你觉得有难度,那可能是对递归的原理了解不够。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值