快速排序-C语言实现

快速排序

排序思想

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

来个动画演示

image
【引用网络上图源:@五分钟学算法 之 快速排序】

可以看到,那个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)

一样的按照上面重复,那么。。。。。。不多说

代码实现【看注释】

/**
* @平台:博客园
* @实现:快速排序算法实现
* @author 咸瑜
*/
#include <stdio.h>
/**
* 划分Pivot
* @param a 数组
* @param low L标识
* @param high R标识
* @return Pivot
*/
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;
}
/**
* 递归快速插入排序
* @param a 数组
* @param low L标识
* @param high R标识
*/
void KS_sort(int a[], int low, int high) {
if (low < high) {
int pivotPos = Partition(a, low, high); //获取Pivot
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;
}

时间&空间复杂度

时间复杂度

从快速排序算法的递归树可知,快速排序的趟数取决于递归树的深度

image

空间复杂度

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

image

特點

posted @   咸瑜  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2021-10-04 SB后端写接口 小规范 CommonResp 类
点击右上角即可分享
微信分享提示