bfprt演算法解決的問題十分經典,即從某n個元素的序列中選出第k大(第k小)的元素,通過巧妙的分 析,bfprt可以保證在最壞情況下仍為線性時間複雜度。該演算法的思想與快速排序思想相似,當然,為使得演算法在最壞情況下,依然能達到o(n)的時間複雜 度,五位演算法作者做了精妙的處理。
**如果待查詢的集合中,重複元素過多,不建議使用,可能無限迴圈下去。1、如果 陣列a 長度小於等於5,將陣列a排序,取出第 n 位的數字
2、陣列a長度大於5,將 陣列a 分割多個長度為5的陣列
3、將分割的陣列長度等於5的分別排序,找到中間數,組成中間數 陣列b
4、找到中間 陣列b 的 中間數x,將 陣列a 根據與 中間數x 的比較,分割為左右兩個陣列
5、如果要查詢的 位數n 小於 左陣列c 長度,將 左陣列c 從第一步重新開始,如果查詢的 位數n 大於 左陣列c 長度,將 右陣列d 從第一步重新開始,此時 位數 n=n-左陣列c的長度
示例:找第n=
10位元素
[100,20
,50,49
,29,15
,22,8
,101,33
,44,55
,66]100,20
,50,49
,29//排序後的中間數為 4915,
22,8,
101,
33//排序後的中間數為 2244,
55,66中間陣列為 [49,
22]以22分割初始陣列[20
,15,22
,8]//左陣列
[100,50
,49,29
,101,33
,44,55
,66]//右陣列
n>左陣列的長度4,將右陣列作為初始陣列,n=10-
4=6100,50
,49,29
,10133,
44,55,
66中間陣列為[50]
以50分割初始陣列[50
,49,29
,33,44
]//左陣列
[100
,101,55
,66]//右陣列
n>左陣列的長度5,將右陣列作為初始陣列,n=6-
5=1右陣列長度4
<
5將右陣列排序,取出第n位數字55,
66,100,
101//取出第1位數字
所查詢的數字為:55
function
linefind
($arr
,$number
)//按5的長度,分割陣列
$newarr
=array_chunk
($arr,5
);foreach
($newarr
as$val)}
//找到 中間數集合 的中間數,將陣列分割為左右兩陣列
$middlenumber
=$middlearr
[floor
(count
($middlearr)/
2)];
$left
=$right=[
];for($i=
0;$i<
$arrsize;$i
++)elseif
($arr[$i
]>
$middlenumber)}
//判斷要尋找的第n位數字的位置if(
$number
<=
count
($left))
else
}$arr=[
100,20,
50,49,
29,15,
22,8,
101,33,
44,55,
66];var_dump
(linefind
($arr,10
));// 55
菜鳥教程《十大程式設計演算法助程式設計師走上高手之路》 查詢演算法之線性查詢
1.線性查詢 2.二分查詢 3.插值查詢 4.斐波那契查詢 分割數列 從線性數列中的起始位置依次比較判斷數列中是否包含需要查詢的數,若找到了直接返回下標 題 有乙個數列 判斷數列中是否包含1000 要求 如果找到了,就提示找到,並給出下標值。這裡我們實現的線性查詢是找到乙個滿足條件的值,就返回 pa...
06查詢演算法之線性查詢
章節目錄 線性查詢是逐一比對,發現有相同的值,就返回下標 package g查詢 author zhou jian date 2020 2020 1 5 0005 15 32 public class sequencesearch 沒有順序的陣列 system.out.println sequenc...
查詢演算法 線性(順序)查詢演算法
線性查詢又稱順序查詢,是一種最簡單的查詢方法,它的基本思想是從第乙個記錄開始,逐個比較記錄的關鍵字,直到和給定的k值相等,則查詢成功 若比較結果與檔案中n個記錄的關鍵字都不等,則查詢失敗。實現 public class seqsearch int index seqsearch arr,3 if i...