1. 快速排序算法概述
快速排序(Quick Sort)是一种基于分治思想的高效排序算法,由计算机科学家Tony Hoare于1959年提出。它的核心思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
在实际应用中,快速排序表现出以下几个显著特点:
- 平均时间复杂度为O(n log n),在大多数情况下性能优于其他O(n²)的排序算法
- 采用原地排序(in-place)方式,空间复杂度为O(log n)
- 是不稳定的排序算法(相同元素的相对位置可能改变)
- 对小规模数据排序效率可能不如插入排序等简单算法
注意:虽然快速排序的平均性能很好,但在最坏情况下(如输入数组已经有序)时间复杂度会退化到O(n²)。在实际应用中通常会结合其他优化策略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Python实现快速排序的核心逻辑
2.1 基础实现解析
让我们先看一个标准的Python快速排序实现,这正是输入示例中提供的代码:
python复制def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
这段代码清晰地展示了快速排序的三个关键步骤:
- 基准值(pivot)选择:取数组中间位置的元素作为基准(
arr[len(arr)//2]) - 分区(partition):将数组分为小于、等于和大于基准值的三个子数组
- 递归排序:对小于和大于基准值的子数组递归调用快速排序
2.2 时间复杂度分析
快速排序的性能高度依赖于基准值的选择质量。理想情况下,每次都能将数组均匀分成两部分:
- 最佳情况:每次分区都恰好将数组分成两半,递归树高度为log₂n,每层处理n个元素,时间复杂度为O(n log n)
- 最坏情况:每次分区都极度不平衡(如数组已排序),递归树退化为链表,高度为n,时间复杂度为O(n²)
- 平均情况:通过数学期望可以证明平均时间复杂度仍为O(n log n)
2.3 空间复杂度考量
上述实现方式的空间复杂度值得注意:
- 每次递归调用都会创建新的子列表(left/middle/right)
- 最坏情况下需要O(n)的额外空间
- 可以通过原地(in-place)分区优化到O(log n)的栈空间
3. 快速排序的优化策略
3.1 基准值选择优化
基础实现中简单地选择中间元素作为基准值,这可能导致性能问题。常见的优化策略包括:
- 三数取中法:取数组首、中、尾三个元素的中位数作为基准值
python复制def median_of_three(arr, low, high): mid = (low + high) /
