写在前面
- 本博客主要从快排的思想,时间复杂度分析和实现三方面来写。熟练掌握手写快速排序是面试常考点。
1. 快速排序的思想
- 快速排序基于分而治之(D&C,divide and conquer)的思想,顾名思义,就是分开“治它”。也是一种递归思想
1.2 回归递归思想
- 递归需要两个东西,一个是基线条件(递归出口),一个递归条件(何时调用自己)
1.3 快速排序的步骤
(1) 选择一个基准值pivot
(2)将数组分成两个数组:小于基准值的子数组和大于基准值的子数组
(3)对这两个数组进行快速排序
(4)判断当前是否为基准条件:数组的长度<2,若是连接所有数组返回,若不是,返回(2)
2. 快速排序的时间复杂度分析
- 首先,这里分析什么原因会导致快排的时间复杂度的变化。答案是基准值的选取。一般来说,我们肯定会选取数组中的第一个元素当成基准值,当数组有序时,时间复杂度会变成O(n**2),其余情况为O(nlogn)
- 时间复杂度由两部分组成:递归栈的深度,划分操作(判断大于小于基准值)
2.1 平均时间复杂度
- 这里的平均时间复杂度指的是最佳时间复杂度
- 栈的深度怎么计算:看划分了几次,我们设划分了k次,则2**k=n,n表示数组元素的个数,所以k=logn
- 划分操作:对于每一次的划分,我们其实都操作了O(n)的复杂度,因为我们知道O(kn)=O(n),这里k=1/2,1/4…
- 所以总的时间复杂度为O(nlogn)
2.2 最坏的时间复杂度
- 考虑数组是有序的,我们依然选取第一元素为基准值
- 这里栈的深度为O(n),所以总的时间复杂度为O(n**2)
3. python实现
def quick_sort(array):
if len(array) < 2: # 基线条件
return array
else:
pivot = array[0]
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]
return quick_sort(less) + [pivot] + quick_sort(greater) # 递归条件