Python3&数据结构之快速排序

然后使用快速排序使用了分而治之(divide and conquer,D&C)的思想
主要思想就是把一个无序数组分为3个部分:递归的思想重复以上步骤

  • 中心点(pivot):该点是随机选的,一般选数组中索引为0,即第一个数当中心点
  • 左边(less):小于等于中心点的数组成的数组
  • 右边(greater):大于中心点的数组成的数组

参考算法图解给出的代码

#quicksort
def quick_sort(arr):

    if len(arr) < 2:
        return arr
    else:
        pivot = arr[0]
        less = [i for i in arr[1:] if i <= pivot]
        greater = [i for i in arr[1:] if i > pivot]
        return quicksort(less)+[pivot]+quicksort(greater)

if __name__ == '__main__':
    test = [49, 38, 65, 97, 76, 13, 27, 49]
    print(quick_sort(test))

中间使用了两次循环,虽然在时间复杂度上没有任何变化,但实际时间不如使用一次循环

#quicksort
def quicksort(arr):

    if len(arr) < 2:
        return arr
    else:
        less = []
        greater = []
        pivot = arr[0]
        for i in arr[1:]:
            if i <= pivot:
                less.append(i)
            else:
                greater.append(i)
        return quicksort(less)+[pivot]+quicksort(greater)

if __name__ == '__main__':
    test = [49, 38, 65, 97, 76, 13, 27, 49]
    print(quicksort(test))

在平均情况下,快速排序的时间复杂度为O(nlogn)

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

至于为什么有的时候复杂度为O(nlogn),有的时候复杂度为O(n^2)?这和选择的基准值,即pivot有关。

最坏的情况下会递归n次,即调用栈(call stack)的高度为n

而平均情况下,会递归logn次,即调用栈的高度为logn

还有一种排序算法的时间复杂度总是O(nlogn),这种排序算法即为合并排序

既然如此,为什么我们经常使用快速排序,而不使用合并排序?

下节在合并排序中一起讲解。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值