快速排序(分治法O(nlogn))

本文详细介绍了快速排序算法的实现原理及步骤,包括如何通过递归进行分区和排序,并提供了清晰的伪代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

划分问题:把数组的各个元素重排后分成左右两部分,使得左边的任意元素都小于等于右边的任意元素。
递归求解:把左右两部分分别排序。
合并问题:不用合并,因为此时数组已经完全有序。

void qsort(int L,int R){
    if(L>=R)return;
    int l=L,r=R;
    int key=a[l];//取a[l]为关键字

    while(l<r){
        while(l<r&&a[r]>=key)r--;
        a[l]=a[r];    //由于a[l]最初被保存在key中,所以可以被覆盖

        while(l<r&&a[l]<=key)l++;
        a[r]=a[l];    //由于先执行了第8行,所以a[r]在这里可以被覆盖
    }
    a[l]=key;

    qsort(L,l-1);//对分界点左边快排
    qsort(l+1,R);//对分界点右边快排
}

如果将“划分问题”单独写成一个函数,程序会清爽些:

int part(int l,int r){//排序并返回分界点
    int key=a[l];
    while(l<r){
        while(l<r&&a[r]>=key)r--;
        a[l]=a[r];

        while(l<r&&a[l]<=key)l++;
        a[r]=a[l];
    }
    a[l]=key;
    return l;
}

void qsort(int l,int r){
    if(l>=r)return;
    int p=part(l,r);
    qsort(l,p-1);//对分界点左边快排
    qsort(p+1,r);//对分界点右边快排
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值