分治专题:快速排序核心思想与应用
前言
快速排序不仅是一种排序算法,更体现了'分而治之'的核心思维。其本质是将复杂问题拆解为规模更小的子问题,通过递归逐步求解。快速排序通过选取基准元素将数组分区,在无序中建立局部秩序,最终实现全局有序。该思想不仅适用于排序,也广泛应用于高效查找与选择问题。本文将围绕快速排序,深入探讨其分治思想在典型算法题中的应用。
1. 颜色分类
题目链接:75. 颜色分类
题目描述:给定一个包含红色、白色和蓝色(分别用整数 0、1、2 表示)的数组 nums,要求原地排序,使相同颜色的元素相邻,并按红、白、蓝顺序排列。不能使用库的排序函数。
示例:
- 输入:
nums = [2,0,2,1,1,0] - 输出:
[0,0,1,1,2,2]
算法思路(三指针法)
本题可视为快速排序分区思想的简化版(荷兰国旗问题)。通过三个指针将数组划分为三个区域:
- 指针定义:
left:指向0区域的末尾,初始为-1。cur:当前遍历指针,初始为0。right:指向2区域的起始位置,初始为n(数组长度)。
- 区域划分:
[0, left]:全为0[left + 1, cur - 1]:全为1[cur, right - 1]:待处理区域[right, n - 1]:全为2
- 遍历与交换:
- 当
cur < right时循环:- 若
nums[cur] == 0:与left + 1位置交换,left++,cur++。 - 若
nums[cur] == 1:已在正确区域,cur++。 - 若
nums[cur] == 2:与right - 1位置交换,right--。注意:交换后cur不移动,因为换过来的元素尚未检查。
- 若
- 当
- 终止条件:
cur与right相遇时,所有元素已分类完毕。
C++ 代码实现
class Solution {
public:
void {
n = nums.();
left = , right = n, cur = ;
(cur < right) {
(nums[cur] == ) {
(nums[++left], nums[cur++]);
} (nums[cur] == ) {
cur++;
} {
(nums[--right], nums[cur]);
}
}
}
};


