快速排序算法又称为分割交换法;其基本思路是:先在数据中找一个虚拟的中间值,按中间值将整个数列分为两部分。其中,小于中间值的数据放在左边,大于中间值的数据放在右边;再用同样的方法处理左右两边的数据,直到排序完成为止。
具体代码如下:
def quick_sort(data):
if len(data) <= 1:
return data
else:
pivot = data[0] # 选择第一个元素作为基准值
less_than_pivot = [x for x in data[1:] if x <= pivot] # 小于基准值的元素
greater_than_pivot = [y for y in data[1:] if y > pivot] # 大于基准值的元素
return quick_sort(less_than_pivot) + [pivot] + quick_sort(greater_than_pivot)
print(quick_sort([14, 23, 12, 45, 78]))
# 输出 [12, 14, 23, 45, 78]
代码解释:
(1)有这样一组数列,现在我们对其进行递增排序
(2)取数列的第一个数做为虚拟中间值,将小于中间值的数据放在左边,大于中间值的数据放在右边
(3)左边只有一个数,不需要排序;右边取23为基准值,将小于中间值的数据放在左边(这个数列里面没有比23小的所以为NaN(空)),大于中间值的数据放在右边
(4) 这里与第三步一样,右边取45为基准值,将小于中间值的数据放在左边(这个数列里面没有比23小的所以为NaN(空)),大于中间值的数据放在右边
(5) 至此排序结束,递归算法会将数据依次弹出,得到排序结果
(6)排序完成输出结果
快速排序是一种非常高效的排序算法,适用于大数据量的排序。它的平均时间复杂度为O(n log n),最坏情况下的时间复杂度为O(n^2),但通过合理选择基准值,可以避免最坏情况的发生。
注意事项
- 基准值的选择:基准值的选择对快速排序的性能有很大影响。常见的做法是选择第一个元素、最后一个元素、中间元素或随机元素作为基准值。
- 递归深度:快速排序的递归深度为O(log n),但在最坏情况下可以达到O(n),这可能会导致栈溢出。可以通过尾递归优化或使用迭代代替递归来避免这个问题。
- 稳定性:快速排序不是稳定的排序算法,即相等的元素可能会改变它们的相对顺序。
平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | |
快速排序算法 | O(n log n) | O(n^2) | O(log n) |