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、每次选用数据集的中位数作为枢轴
二、划分的最小数列长度
因为快速排序是对自序列不停递归的一个过程(分治法)。所以如果递归的过多,堆栈带来的性能损失也是不容小视的。还有最重要的一点就是在数据量很小的情况下,插入排序在时间上的性能要比快速排序的性能要好。所以在快速排序进行递归的过程中,如果在序列比较短的时候调用插入排序而不是快速排序,那么性能就会有所提高。具体序列长度为多少时改为插入排序要根据具体的机器和数据而定。