快速排序
排序思想
| 1. 选定Pivot中心轴 |
| 2. 将大于Pivot的数字放在Pivot的右边 |
| 3. 将小于Pivot的数字放在Pivot的左边 |
| 4. 分别对左右子序列(此时有左右2个子表),重复前三步操作。 |
| 5.注意:第4步中,如果左右子表元素 == 1,那就不用动,证明排序完了。 |
来个动画演示

【引用网络上图源:@五分钟学算法 之 快速排序】
可以看到,那个Pivot一般选取最第一个或最后一个元素,还有2个标记 l 和 r,如果发生了改变,那么它们会交替移动,直到碰在一起(产生了爱情...)
简化成3个元素:
序列: 3 2 1:
首先我们取1为Pivot,然后l 和 r 指向了 3 和 1;
然后3 和 1对比,3 > 1,那么 在1的右边,所以3 移动到 r 位:
序列: _ 2 3
然后 因为操作了,移动R 【指向2】
然后 2 和 1对比,2 > 1, 所以要放在1的右边,那么本来就在1的右边,所以不用动,序列变成:
序列: _ 2 3
因为没用动,所以r继续移动,此时 r 和 l 相遇了,所以把1放在相遇的地点:序列变成:
序列: 1 2 3
那么 1 的左边是没有元素的,所以是排序成功,那么开始排序右边(2 和 3)
一样的按照上面重复,那么。。。。。。不多说
代码实现【看注释】
| |
| |
| |
| |
| |
| |
| #include <stdio.h> |
| |
| |
| |
| |
| |
| |
| |
| |
| int Partition(int a[], int low, int high) { |
| int pivot = a[low]; |
| while (low < high) { |
| while (low < high && a[high] >= pivot) --high; |
| a[low] = a[high]; |
| while (low < high && a[low] <= pivot) ++low; |
| a[high] = a[low]; |
| } |
| a[low] = pivot; |
| return low; |
| } |
| |
| |
| |
| |
| |
| |
| |
| void KS_sort(int a[], int low, int high) { |
| if (low < high) { |
| int pivotPos = Partition(a, low, high); |
| KS_sort(a, low, pivotPos - 1); |
| KS_sort(a, pivotPos + 1, high); |
| } |
| } |
| |
| |
| int main() { |
| int k, a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; |
| KS_sort(a, 0, 9); |
| for (k = 0; k < 10; k++) { |
| printf("%d", a[k]); |
| } |
| printf("\n"); |
| return 0; |
| } |
时间&空间复杂度
时间复杂度
| 从快速排序算法的递归树可知,快速排序的趟数取决于递归树的深度 |

空间复杂度
| 快速排序是递归的,执行时需要有一个栈来存放相应的数据。 |
| 最大递归调用次数与递归树的深度一致 |

特點
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-10-04 SB后端写接口 小规范 CommonResp 类