快速排序的背后——深入理解时间复杂度

时间复杂度的概念衡量算法性能的重要标准,是算法设计和性能优化中的关键概念,对于编写高效、稳定和可扩展的程序至关重要。但是,初学者对于如何理解和应用时间复杂度则显得较为困难,本文以快速排序为例进一步加深对时间复杂度的理解。

1 回顾

本文侧重于时间复杂度的计算,关于时间复杂度的概念可参考二分查找——算法基础
首先,我们回顾一下快速排序

def quicksort(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)

在之前的文章中谈过,大O表示法在表示时间复杂度的时候考虑的是最遭的情况,但是由于快速排序的特殊性,需要特别强调平均情况下的时间复杂度。

1 最遭的情况

当我们每次选定的基准值都是无序列表中的最小或最大值的时候,这个时候该算法的时间复杂度与选择排序无差异为 O ( n 2 ) O_(n^2) O(n2),因为每次进行子集的划分都要对列表内的各个元素操作一次,而像这样的操作要执行n次(调用栈高度为n)。
在这里插入图片描述

2 一般情况

但是,当每次选择到的pivot都是集合中大小居中的元素,这个时候操作的子集数为 l o g 2 n log_{2}n log2n
在这里插入图片描述
而用户给函数提供的列表多是无序的,所以可以以平均情况下的时间复杂度来表示快速排序的性能,即平均下来,调用栈的高度为 l o g 2 n log_{2}n log2n,而每次对站内存储的列表元素都要进行对比,所以操作次数为 n n n,所以时间复杂度为:
O n l o g 2 n → n ⋅ l o g 2 n O_{nlog_{2}n}\to n\cdot log_{2}n Onlog2nnlog2n

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Odd_guy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值