(如果知道quicksort請跳到2.)
1.關於quicksort
首先,隨機挑取陣列其中一個元素作為pivot(以下假設我們希望遞減)
逐個檢查每個元素,考慮兩個指標L, R,如果正在檢查的元素比pivot大,與L所指向的元素交換,L++,否則與R交換,R--
透過遞迴的方式分割陣列,我們就可以得到一個遞減陣列了:D,"平均"複雜度O(nlogn)
(實際在寫的時候可能有很多細節,沒關係願意看到這裡的各位一定能自己寫出來的)
2.關於quickselect
誠然,我們不需要真的把整個陣列拿去排序,因為我們只需要第K大的元素
仔細觀察quicksort,雖然它是基於遞迴的比較排序,但每一次的pivot都能保證被放在正確的位置
(正確的數量比pivot小,正確的數量比pivot大)
所以對於最終pivot的位置,如果比K還小,把比pivot還小的部分排序,反之亦反
如果陣列數組足夠無序,我們就得到了平均O(n)的演算法了:D
(當然,最糟也是O(n^2),但測資善良沒有這個問題)