BFPRT算法,BFPRT算法O(n)解決第k小的數

第k小算法

我們通常會簡單地進行一個快速排序後,得到第k個位置上的數字即可。
我們都知道的是快速排序是個不穩定的排序,它的排序過程簡單的理解主要是兩個概念Partion,pivot(基準數)

一趟快速排序的過程如下

  1. 先從序列中選取一個數作爲基準數
  2. 將比這個數大的數全部放到它的右邊,把小於或者等於它的數全部放到它的左邊

一趟快速排序也叫做Partion,即將序列劃分爲兩部分,一部分比基準數小,另一部分比基準數大,然後
再進行分治過程,因爲每一次Partion不一定都能保證劃分得很均勻,所以最壞情況下的時間複雜度不能
保證總是O(nlogn)的。

BFPRT算法

BFPTR算法中,僅僅是改變了快速排序Partion中的pivot值的選取,在快速排序中,我們始終選擇第一個元
素或者最後一個元素作爲pivot,而在BFPTR算法中,每次選擇五分中位數的中位數作爲pivot,這樣做的目的
就是使得劃分比較合理,從而避免了最壞情況的發生。算法步驟如下

(1)將輸入數組的n個元素劃分爲n/5組,每組5個元素,且至多隻有一個組由剩下的n%5個元素組成。
(2)尋找n/5個組中每一個組的中位數,首先對每組的元素進行插入排序,然後從排序過的序列中選出中位數。
(3)對於(2)中找出的n/5箇中位數,遞歸進行步驟(1)和(2),直到只剩下一個數即爲這n/5個元素的中位數,找到中位數後並找到對應的下標p。
(4)進行Partion劃分過程,Partion劃分中的pivot元素下標爲p。
(5)進行高低區判斷即可。

本算法的最壞時間複雜度爲O(n),值得注意的是通過BFPTR算法將數組按第K小(大)的元素劃分爲兩部分,而
這高低兩部分不一定是有序的,通常我們也不需要求出順序,而只需要求出前K大的或者前K小的。

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