BFPTR排序演算法(O n 時間複雜度)

2021-10-07 00:01:25 字數 2013 閱讀 4847

bfptr演算法,又稱為中位數的中位數演算法,它的最壞時間複雜度為o(n),它是由blum、floyd、pratt、rivest、tarjan提出。該演算法的思想是修改快速選擇演算法的主元選取方法,提高演算法在最壞情況下的時間複雜度。

n個元素劃為[n/5]組,每組5個,至多只有一組由n mod 5個元素組成。

尋找這[n/5]個組中每乙個組的中位數,這個過程可以用插入排序。

對步驟2中的[n/5]個中位數,重複步驟1和步驟2,遞迴下去,直到剩下乙個數字。

最終剩下的數字即為pivot,把大於它的數全放左邊,小於等於它的數全放右邊。

判斷pivot的位置與k的大小,有選擇的對左邊或右邊遞迴。

求第 k 大就是求第n-k+1 小,這兩者等價。

package leetcode;

class

solution_bfprt

else

if(left_num > k)

else

}//將陣列劃分成n/5份,然後找這n/5個中位數中的中位數

public

static

intgetpivotindex

(int

arr,

int left,

int right)

int i = left, j = left -1;

while

(i +

4<= right)

//以上操作完成後,陣列[left,j]區間上的數為每乙個小陣列的中位數。使用bfprt演算法再求中位數的中位數,是為了降低時間複雜度。

//最後乙個引數多加乙個 1 的作用其實就是向上取整的意思,這樣可以始終保持 k 大於 0。

//因為陣列中第k小的元素,k的值是從1開始的

return

bfprt

(arr, left, j,

(j - left +1)

/2+1

);}/*

* k為主元的下標,以下標k的元素值,進行一次劃分,將陣列劃分成三個區域

* 返回等於區域的右邊界

* */

public

static

intpartition

(int

arr,

int left,

int right,

int k)

else

if(arr[cur]

> pivot)

else

}swap

(arr, cur, right)

;return cur;

}//使用 插入排序 找陣列的中位數的下標

public

static

intinsertsort

(int

arr,

int left,

int right)

}return mid;

//返回下標。

}public

static

void

swap

(int

arr,

int a,

int b)

public

static

void

main

(string[

] args)

;//使用bfprt演算法獲取第k小的元素的下標

int index =

bfprt

(arr,

0, arr.length -1,

10);//則第k小的元素的值為arr[index],此時arr陣列中的順序已經被更改。

system.out.

println

(arr[index]);

}}

你知道的越多,你不知道的越多。

js排序的時間複雜度 各種排序演算法時間複雜度

各種排序演算法比較 各種常用排序演算法 類別排序方法 時間複雜度 空間複雜度 穩定性複雜性 特點最好 平均最壞 輔助儲存 簡單插入 排序直接插入 o n o n2 o n2 o 1 穩定簡單 希爾排序 o n o n1.3 o n2 o 1 不穩定複雜 選擇排序 直接選擇 o n o n2 o n2...

時間複雜度為on的排序演算法 演算法的時間複雜度理論

yishun 可計算性理論的理解 zhuanlan.zhihu.com 現在,我們來討論演算法執行的時間複雜度。表示以下函式集合 o g n 表示以下函式集合 表示以下函式集合 f n 或 o g n 表示f n 是 或 o g n 的成員。首先要明確輸入規模的概念,一般來說,它指編碼演算法輸入所需...

排序演算法空間 時間複雜度

排序演算法空間 時間複雜度 簡單排序法 冒泡法是第二維迴圈中自己迴圈,找最小或最大值 選擇排序和交換排序是第二維迴圈與第一維迴圈中的值比較 交換法最清晰,選擇法作了改進,只交換位置標號,演算法複雜度沒變。插入法,它的基本工作原理是抽出牌,在前面的牌中尋找相應的位置插入,然後繼續下一張 較為複雜 高階...