逆序情况下的快速排序真的很慢吗???

本文探讨了快速排序在不同场景下的性能,通过希尔排序创建逆序样本,对比未经二分优化和优化后的快速排序算法。在普通无序数据中,未优化版本略微优于优化版,但在逆序情况下,优化后的算法效率提高了约5倍。结论指出,对于局部逆序数据,采用二分优化的快速排序能显著提高效率。
摘要由CSDN通过智能技术生成

一、测试数据准备阶段:


1.用rand()函数实现随机生成10w个-500~500的数据经过word文档处理空白后以作为10w无序数据样本。
在这里插入图片描述
2.用希尔排序排出逆序以作为逆序样本。
3.我选择leetcode 912题作为OJ评判。(手动输入(复制粘贴)这10w测试用例)

二.测试阶段。

1.普通无序情况下的时间测试(10w数据):(测试5次取平均数)
未经二分优化的普通快速排序:平均112.6ms贴出了最好的一次
经过二分优化后的快速排序:平均122.4ms在这里插入图片描述
2.逆序情况
未经二分优化的排序时间:平均549.6ms在这里插入图片描述
经过二分优化后的时间:平均103.2ms在这里插入图片描述

三.总结和二分优化代码

通过上述两者对比可发现普通快速排序在面对一般情形下,相比二分优化后的反而表现好一点点,但是在逆序情况下却比二分优化后的代码效率差了5倍左右,而二分优化后的代码在逆序情况下反而比一般情况要好一点.最后我认为,在面对局部逆序的情况下采取二分优化会快很多!
贴代码:

void quicksort(int* nums,int n)//应用二分思想
{ if (n<2) return;
   int l=0,r=n-1;
    int mid=nums[(l+r)/2];//中间数
    
    while(l<=r){//这里和下面的'='千万不能省,这是让最后l和r的指向可能性只会有两种可能,要么l和r相邻(r左l右),要么l和r中间隔了一个数(那么这个数肯定是确定好位置的。l右r左)
        while(nums[l]<mid) l++;//查找左半部分比中间数大的数
        while(nums[r]>mid) r--;//查找右半部分比中间数小的数
        if(l<=r)//如果有一组不满足排序条件(左小右大)的数
        {/*交换值:这里注意有一个小坑,
        不能用加法或者异或来实现值的交换,
        因为当nums[i]和nums[j]指的是同一个变量时(i=j时),
        就会出现bug。*/
            int temp = nums[r];
            nums[r] = nums[l];
            nums[l] = temp;
            l++;
            r--;
        }
    }
     quicksort(nums,r+1);//递归搜索左半部分
     quicksort(nums+l,n-l);//递归搜索右半部分
     //最后这个左右搜索部分元素一定不能重合,或者少包含了一些元素(除非是这一轮已经排好的这一个),就算你的左右搜索部分包含了原本已经确定了位置的元素,也没关系。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值