快排

void  quicksort(int*arr,int l,int r)
{
   if(l<r)
   {
     int i=l,j=r,x=arr[i];
     while(i<j && arr[j]>=arr[i])j--;
     if(i<j)arr[i++]=arr[j];
     while(i<j&&arr[j]<arr[i])i++;
     if(i<j)arr[j--]=arr[i];
     arr[i]=x;
     quicksort(arr,l,i-1);
     quicksort(arr,i+1,r);
   }
}

缺点:
在最坏的情况下,待排序的序列为正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。如果递归树画出来,它就是一棵斜树。此时需要执行n‐1次递归调用,且第i次划分需要经过n‐i次关键字的比较才能找到第i个记录,也就是枢轴的位置,因此比较次数为 这里写图片描述,最终其时间复杂度为O(n2)。
改进方法:
一、改进选取中枢轴
1、选取随机数作为枢轴
(引入的原因:在待排序列是部分有序时,固定选取枢轴使快排效率底下,要缓解这种情况,就引入了随机选取枢轴)
2、选用左端、中间、右端这三个数的中间值作为枢轴
(引入的原因:虽然随机选取枢轴时,减少出现不好分割的几率,但是最坏情况下还是O(n^2),要缓解这种情况,就引入了三数取中选取枢轴)
3、每次选用数据集的中位数作为枢轴
二、划分的最小数列长度
因为快速排序是对自序列不停递归的一个过程(分治法)。所以如果递归的过多,堆栈带来的性能损失也是不容小视的。还有最重要的一点就是在数据量很小的情况下,插入排序在时间上的性能要比快速排序的性能要好。所以在快速排序进行递归的过程中,如果在序列比较短的时候调用插入排序而不是快速排序,那么性能就会有所提高。具体序列长度为多少时改为插入排序要根据具体的机器和数据而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值