快速排序-C语言实现
快速排序
排序思想
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)
一样的按照上面重复,那么。。。。。。不多说
代码实现【看注释】
/**
* @平台:博客园
* @实现:快速排序算法实现
* @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;
}
时间&空间复杂度
时间复杂度
从快速排序算法的递归树可知,快速排序的趟数取决于递归树的深度
空间复杂度
快速排序是递归的,执行时需要有一个栈来存放相应的数据。
最大递归调用次数与递归树的深度一致
特點
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/16751427.html