快速排序详解:分区过程图解 + C++ 代码 + 复杂度分析(含可视化动画)
·
一、快速排序是什么 快速排序是一种基于分治(Divide and Conquer)的排序算法,平均时间复杂度 O(n log n),原地排序,不稳定。核心是 partition(分区):选一个基准 pivot,把比它小的放左边、大的放右边,然后对左右两段递归。
二、分区过程图解 以数组 [5,3,8,1,9,2,7]、选末位为基准为例:
-
设置指针 i 指向"小于区"的边界;
-
指针 j 从左扫到右,遇到比基准小的元素就和 i 位置交换、i 右移;
-
扫描结束把基准换到 i 位置,此时基准左边全小、右边全大;
-
对基准左右两段分别递归。
三、C++ 参考实现
int partition(vector<int>& a, int l, int r) {
int pivot = a[r], i = l;
for (int j = l; j < r; ++j)
if (a[j] < pivot) swap(a[i++], a[j]);
swap(a[i], a[r]);
return i;
}
void quickSort(vector<int>& a, int l, int r) {
if (l >= r) return;
int p = partition(a, l, r);
quickSort(a, l, p - 1);
quickSort(a, p + 1, r);
}
四、复杂度与稳定性
-
平均 O(n log n),最坏 O(n²)(已序且基准选端点时),可用随机化基准缓解;
-
空间 O(log n)(递归栈);
-
不稳定排序。
五、动画看一遍更透 分区时指针怎么走、什么时候交换,文字描述总隔一层。可以在码路星球看快排的逐帧动画:柱状图实时交换、基准高亮、递归分治可视化,代码逐行同步高亮、变量实时追踪,还能导出视频。站内有完整一套排序算法(冒泡/选择/插入/希尔/归并/快排/堆排/计数),对比着看更清楚。我不慌----成长杂货铺(我不慌 · 成长杂货铺 | wobuhuang.com),免费。
更多推荐

所有评论(0)