#55377: quickselect


Ixcy (Ixcy)


(如果知道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),但測資善良沒有這個問題)