手推记录-快速排序

本文详细介绍了快速排序算法的工作原理,包括如何选择基准元素、通过递归将数组分为更小的部分进行排序,并提供了C++实现示例代码。此外还讨论了算法的时间复杂度、空间复杂度及其稳定性。

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

快速排序

该算法是分治算法,首先选择一个基准元素,根据基准元素将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

用一个例子来表达算法过程:
比如一个数组A={43,65,34,23,75,80,24,37,50,53}
1.先选择A[0]=43作为基准,先从最后一个开始比较。
此时 i=0,j=9,x=43;
这里写图片描述
2.从右开始找,直到找到小于43的数,即A[7]。
3.将A[7]与A[0]交换。i++。
这里写图片描述
此时,i=1,j=7,x=43;
4. 从做开始找,直到找到大于等于43的数,即A[1]。
5. 将A[7]与A[1]交换。j–。
这里写图片描述
此时,i=1,j=6,x=43;
6. 然后再重复2过程,直到i=j退出。
7. 此时,数据分成两个子数组,左边都小于43,右边都大于43。
这里写图片描述
8. 之后递归这两个数组即可完成排序。
9. c++代码

#include <iostream>
using namespace std;

void qsort(int s[],int l,int r){
    int i=l,j=r,x=s[l];
    if(l<r){
        while(i<j){
            while(i<j&&s[j]>=x)j--;
            if(i<j)s[i++]=s[j];
            while(i<j&&s[i]<x)i++;
            if(i<j)s[j--]=s[i];
        }
        s[i]=x;
        qsort(s,l,i-1);
        qsort(s,i+1,r);
    }
}
//测试
int main(int argc, const char * argv[]) {
    int array[]={43,65,34,23,75,80,24,37,50,53},k;
    int len=sizeof(array)/sizeof(int);
    cout<<"The orginal arrayare:"<<endl;
    for(k=0;k<len;k++)
        cout<<array[k]<<",";
    cout<<endl;
    qsort(array,0,len-1);
    cout<<"The sorted arrayare:"<<endl;
    for(k=0;k<len;k++)
        cout<<array[k]<<",";
    cout<<endl;
    return 0;
}

算法总结:
时间复杂度:(最坏)O(N2)O(N2),(最好)O(nlogn)O(nlogn),(平均)O(nlogn)O(nlogn)
空间复杂度: O(nlogn)O(nlogn)
稳定性:快排会把大于等于基准的放在基准的后面,那么如果选择相等的本来在后面的数作为基准,则破坏了相对顺序,因此快排是不稳定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值