優化快速排序的幾個方法

普通的快排方法對於隨機數組來說是挺快的,但是當遇到已經排好序的數組,複雜度馬上就降爲O(n^2)了。


所以我們需要對其進行優化。首先產生這種情況的原因是什麼?是基數,當一個已經排好序的數組,我們所選的基數要麼最大,要麼最小,這就使得在排序過程中耗費了大量時間,那麼如何篩選基數?

方法一:隨機數產生區間內的某個數。


方法二:在劃分算法上進行優化。


我們將同時從兩端進行遍歷,將需要的值進行交換即可。

方法三:短區間進行選擇排序。


考慮到選擇算法的最優時間是O(n),也就是對於已經近似排序好的數組,耗費的時間接近於遍歷一次的時間。

方法四:考慮到隨機數耗費的時間比較多,所以更好的做法就是我們人工篩選基數。
將要排序的區間進行分段。
當區間長度小於 7 時,我們採用選擇排序;
當區間長度小於 40 時,我們將區間分成兩段,得到左端點、右端點和中點,我們對這三個點取中數作爲基數;
當區間大於等於 40 時,我們將區間分成 8 段,得到左三點、中三點和右三點,分別再得到左三點中的中數、中三點中的中數和右三點中的中數,再將得到的三個中數取中數,然後將該值作爲基數。
具體代碼只是在上一份的代碼中加個篩選中數函數即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章