快速排序的优化——枢轴数的选择

快排因其优秀的平均性能被广泛使用,但枢轴数的选择影响其效率。文章探讨了两种优化策略:随机选择枢轴和三者取中。测试结果显示,未优化的快排在某些情况下反而更快,而三者取中可能是较好的优化方案。提供测试代码的GitHub链接以供验证。

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

引用严蔚敏的《数据结构》的话,在所有数量级都为nlgn的排序方法中,快排的常数因子k最小。这意味着快排是目前被认为是最好的一种内部排序方法。

下面先放出快排的代码:

void QuickSort(int *a,int low,int high){

       if(low<high){

              int l = low,h = high,flag = a[low];

              while(l<h){

                     while(l<h&&a[h]>=flag) h--;

                     a[l] = a[h];

                     while(l<h&&a[l]<=flag) l++;

                     a[h] = a[l];

              }

              a[l] = flag;

              QuickSort(a,low,l-1);

              QuickSort(a,l+1,high);

       }

}

 

       所以分析快排的时间性能就很有必要了。影响快排的重要因素是枢轴数的选择。理想情况下,如果每次划分两个子数组的长度都相同,那么效率肯定会是最高的,那如果我们每次都找到数组中的中位数作为枢轴数那就可以了。然而输入的数组本身肯定是无序的,如果要找到中位数就需要有序输入,这个做法肯定不行的,我们对快排的改进必须建立在保证递归里的一次操作时间复杂度为O(n)。

       教科书上给出的方法是选择数组第一个数为枢轴数。

优化一:随机选择枢轴数

当数组部分有序,选择第一个数为枢轴数,快排的比较次数会大幅度增加,而且划分子数组的长度会差异较大,当数组基本有序,快排就蜕变为冒泡了,如果随机选择枢轴数,就可以利用随机性来规避这种情况,下面我们来修改一下代码为:

//要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;

void QuickSort_random(int *a,int low,int high){

    if(low<high){

           int random = (
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值