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、每次選用數據集的中位數作爲樞軸
二、劃分的最小數列長度
因爲快速排序是對自序列不停遞歸的一個過程(分治法)。所以如果遞歸的過多,堆棧帶來的性能損失也是不容小視的。還有最重要的一點就是在數據量很小的情況下,插入排序在時間上的性能要比快速排序的性能要好。所以在快速排序進行遞歸的過程中,如果在序列比較短的時候調用插入排序而不是快速排序,那麼性能就會有所提高。具體序列長度爲多少時改爲插入排序要根據具體的機器和數據而定。