王道咸鱼学长快速排序

咸鱼学长快速排序

咸鱼学长的快速排序忘记了再翻翻,代码简洁美丽,真的值得我学习好久。

如图

基于双指针法,左右指针与基准值进行比较,确保分区过程的高效性。。
Partation()函数实现了快速排序的分区操作,将数组分为两部分:左边部分小于等于基准值,右边部分大于等于基准值。
分区点的返回值为后续递归排序提供了依据。
在这里插入图片描述

#include<stdio.h>
int Partation(int l, int r, int a[]) {
    int mid = a[l]; // 选择数组的第一个元素作为基准值(pivot)
    while (l < r) { // 当左指针 l 小于右指针 r 时,继续循环
        // 从右向左扫描,找到第一个小于等于基准值的元素
        while (a[r] > mid && l < r) r--; // 如果当前元素大于基准值,右指针左移
        a[l] = a[r]; // 将找到的小于等于基准值的元素放到左指针的位置
        // 从左向右扫描,找到第一个大于等于基准值的元素
        while (a[l] < mid && l < r) l++; // 如果当前元素小于基准值,左指针右移
        a[r] = a[l]; // 将找到的大于等于基准值的元素放到右指针的位置
        }
    a[l] = mid; // 将基准值放到最终的位置(此时 l == r)
    return l; // 返回基准值的最终位置
}
void QuickSort(int l, int r, int a[]) {
    // 如果左边界 l 大于右边界 r,说明当前子数组已经有序或为空,直接返回
    if (l > r) return;
    int mid = Partation(l, r, a);// 调用分区函数 Partation,获取基准值的最终位置 mid
    QuickSort(l, mid - 1, a);// 递归排序左半部分:从 l 到 mid-1
    QuickSort(mid + 1, r, a);// 递归排序右半部分:从 mid+1 到 r
}
int main() {
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    QuickSort(0,n-1,a);
    for(int i=0;i<n;i++)printf("%d ",a[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值