快速排序(Quick Sort)详解与图解
快速排序(Quick Sort)是一种**分治思想(Divide and Conquer)**的经典算法,也是面试与嵌入式开发中最常用的排序算法之一。
本文通过详细代码、逐步图解和运行示例,带你从零彻底理解快速排序。
一、快速排序的基本思想
快速排序的核心思想非常简洁:
“取一个基准数(pivot),
把数组分成两边:左边比它小,右边比它大,
然后对两边继续递归排序。”
重复这个过程,直到每一段只剩一个元素,整个数组自然有序。
二、代码实现(Hoare 双指针分区法)
void quick_sort(int a[], int l, int r) {// 递归结束条件if (l >= r) return;// 定义两个指针int i = l - 1, j = r + 1;// 选择中间值为基准int pivot = a[(l + r) / 2];// 一次划分while (i < j) {do i++; while (a[i] < pivot);do j--; while (a[j] > pivot);if (i < j) {int temp = a[i];a[i] = a[j];a[j] = temp;}}// 递归左右两部分quick_sort(a, l, j);quick_sort(a, j + 1, r); }
三、算法过程图解
示例数组:
[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
Step 1:第一次划分(pivot = 9)
[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
pivot = 9 ↙----------------↘
[6, 1, 2, 7, 8, 3, 4, 5] [10, 9]左边都比 9 小,右边都比 9 大。
Step 2:第二次划分(左区 pivot = 7)
[6, 1, 2, 7, 8, 3, 4, 5]
pivot = 7 ↙------------↘
[6, 1, 2, 3, 4, 5] [8]
Step 3:第三次划分(左区 pivot = 3)
[6, 1, 2, 3, 4, 5]
pivot = 3 ↙------↘
[1, 2] [4, 5, 6]
Step 4:右区划分(pivot = 10)
[10, 9]
pivot = 10
↙----↘
[9] []
四、递归返回与最终排序结果
当所有区间长度缩小为 1 时,递归开始返回:
[1, 2] + [3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6] + [7] + [8] = [1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8] + [9] + [10] = ✅ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
最终结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
