Python 快速排序算法

本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。
本文章是自己学习的一些记录。

开始

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤为:

从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

快速排序算法的图分析

在这里插入图片描述
思路就是按照两个游标的相互移动来进行排序;
定义出中间值以及游标的位置(一般是选择数列的开头的元素和末尾的元素),将游标从两端开始移动;
当左边游标移动的元素大小小于中间值,则游标进行右移,当大于中间值,和另外的游标位置的元素进行替换;
然后右边的游标的位置开始移动,当移动的元素大于中间值,则游标进行左移,当小于中间值,另外的游标的元素进行替换;
相等时退出循环;
然后在中间值的左右两边分别被分成两个数列,然后同理,继续这样分,排序,直到分成每个数列都是一个元素,排序完成。

快速排序代码

#coding=utf-8
#@Time:2020/10/2 10:20
#@Author:csdn@hijacklei
#@File:快速排序算法.py
#@Software:PyCharm
def quick_sort(alist,first,last):
    '''快速排序'''
    #作为终止循环的条件
    if first>=last:
        return
    #定义中间值
    mid_value=alist[first]
    low=first
    high=last
    #执行循环条件
    while low<high:
        #high左移
        while low<high and alist[high]>=mid_value:
            #右边大于中间值,游标往左移动
            high-=1
        #从循环体退出,high赋值给low的位置
        alist[low]=alist[high]
        while low<high and alist[low]<mid_value:
            #小于中间值左边的游标往右移
            low+=1
        #从循环体退出,low赋值给high的位置
        alist[high]=alist[low]
    #从循环退出时,low==high
    alist[low]=mid_value

    #对low左边的列表执行快速排序
    quick_sort(alist,first,low-1)

    #对low右边的列表进行排序
    quick_sort(alist,low+1,last)

if __name__ == '__main__':
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li) #返回 [54, 26, 93, 17, 77, 31, 44, 55, 20]
    quick_sort(li,0,len(li)-1)
    print(li) #返回 [17, 20, 26, 31, 44, 54, 55, 77, 93]

时间复杂度计算

因为每次都是将一个分成两个,在继续这样分所以,类似与这样分下去:
在这里插入图片描述
所以第一次是2 第二次是4 第三次是8…所以最优时间复杂度是:
在这里插入图片描述
最坏时间复杂度为:
在这里插入图片描述
下面是教程的关于快排时间复杂度的解释:
在这里插入图片描述
参考资料:传智播客数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值