快速排序-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 @ 2022-10-04 14:24  咸瑜  阅读(78)  评论(0)    收藏  举报