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 的成員。首先要明確輸入規模的概念,一般來說,它指編碼演算法輸入所需...
排序演算法空間 時間複雜度
排序演算法空間 時間複雜度 簡單排序法 冒泡法是第二維迴圈中自己迴圈,找最小或最大值 選擇排序和交換排序是第二維迴圈與第一維迴圈中的值比較 交換法最清晰,選擇法作了改進,只交換位置標號,演算法複雜度沒變。插入法,它的基本工作原理是抽出牌,在前面的牌中尋找相應的位置插入,然後繼續下一張 較為複雜 高階...