快排

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章