快速排序是算法领域的"九阳神功",掌握其精髓能让你在算法修炼之路上突破瓶颈。
1、 快速排序的核心思想
快速排序(Quicksort)是一种基于分治思想的高效排序算法,核心步骤为:
- 选择基准值(Pivot):通常选择待排序区间的第一个元素(也可随机选或取中间值)。
[元素≤pivot] + [pivot] + [元素>pivot]
- Partition(分割)操作:
- 将数组分为两部分,使得基准值左侧元素均 ≤ 基准值,右侧元素均 ≥ 基准值。
- 实现方法:通过交替从右向左、从左向右扫描,交换不符合条件的元素,最终确定基准值的正确位置。
- 递归处理子数组:对基准值左右两侧的子数组重复上述步骤,直到所有元素有序。
2、Partition操作的关键细节
- 空位交替填充:选择基准值后,其初始位置视为“空位”,通过交替从后向前扫描小元素、从前向后扫描大元素,将元素填入空位,最终确定基准值的位置。
- 时间复杂度:单次 Partition 操作的时间复杂度为 O(n),需遍历整个子数组。
示例:
原始数组 [8, 6, 3, 10, 9, 7, 2, 12]
,选择 8
为基准值:
- 从右向左找到
2 < 8
,将其填入空位 →[2, 6, 3, 10, 9, 7, _, 12]
。 - 从左向右找到
10 > 8
,将其填入空位 →[2, 6, 3, _, 9, 7, 10, 12]
。 - 重复直至基准值位置确定 →
[2, 6, 3, 7, 9, 8, 10, 12]
。
3、两种经典实现方式
1. Lomuto分区(直观易实现)
- 以最后一个元素为基准
- 双指针维护分割点
def partition(arr, low, high): pivot = arr[high] i = low # 分割点 for j in range(low, high): if arr[j] <= pivot: arr[i], arr[j] = arr[j], arr[i] i += 1 arr[i], arr[high] = arr[high], arr