快速排序(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]