一小部分快速排序的写法总结

本文详细介绍了快速排序算法的工作原理,包括如何选择主元,以及如何通过随机化和二分策略提升算法效率。在面对接近有序的序列时,随机选择主元能避免最坏情况的时间复杂度,而二分思想则能更有效地划分区间。通过这两种优化方法,可以确保快速排序在平均情况下的时间复杂度为O(nlogn)。

快速排序的中心思想是将小的数放在左边,大的数放在右边,那什么算小,什么算大呢?

我们可以在数列中找到一个数来作为评判其他数的大小,大于这个数就放在这个数右边,小于这个数就放在这个数的左边,我们把这个数叫主元。

我们可以把第一个数当成主元,然后分别从数列的头和尾判断每个数的大小,如果左边的数小于主元,那我们继续往后寻找,同理,如果右边的数大于主元,我们继续往前寻找。如果发现左边的指针跟右边的指针都停止了寻找,那我们就将目前左边指针指向的数跟右边指针指向的数交换。直到左边的数都小于主元,右边的数都大于主元,此时左边的指针跟右边的指针指向的位置相同了,我们就把主元放进这个位置,那么一次大概的检索就做完了。

具体代码如下:

int Partition(int A[],int left,int right){ //left跟right的初始值为序列首尾下标
    int temp = A[left];  //temp是主元
    while(left<right){
        while(left<right && A[right] > temp) right--;
        A[left] = A[right];
        while(left<right && A[left] < temp) left++;
        A[left] = A[right];
    }
    A[left] = temp;
    return left;
}

当然,这样的结果肯定还是杂乱无章的,上述操作还需要反复进行,所以我们使用递归算法,反复调用上述操作,直到最后的结果是我们想要的有序数列。

void quickSort(int A[],int left,int right){
    if(left<right){
        //将[left,right]按主元位置一分为二
        int pos = Paetition(A,left,rig
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值