演算法 二分法查詢

2021-09-29 02:39:35 字數 1576 閱讀 8779

免費****

二分法查詢主要是為了快速查詢給定陣列內,期待值在陣列中的位置(下標)

二分法查詢通過對整個陣列取中間值,判斷期待值所在的範圍並縮小範圍,每次查詢範圍折半,直到範圍的邊界重合,得出期待值的位置,如果找不到返回null

二分法有乙個先決條件是:陣列內元素必須是有序的

給定乙個包含1,3,5,7,8,9這乙個元素的有序陣列,求得期待值7所在的位置,下邊用綠塊表示指標所在位置

若是按照直接遍歷的方式,綠塊會從陣列的第乙個下標開始比較,直到7所在的下標得到結果,遍歷需要4次,下邊演示下二分法的圖示

第一次,取值範圍為整個陣列,取陣列長度中間值(0+5)/2取整2作為下標

取中間值初始以陣列的第乙個下標與最後乙個下標相加取中間值,如果不為整,捨去小數部分

比較期待值與下標為2的值大小,發現5<7,7這個值應在中間值的右側

縮小查詢範圍為中間值+1與最大下標

第二次,範圍縮小為原陣列的一半,下標不變,取中間值(3+5)/2=4

下標4對應的值8,大於7,所以向左取範圍最小下標3,最大下標4-1=3

第三次,取中間值(3+3)/2=3,下標3上的值恰好與期待值相等,返回下標3

雖然看起來只少了一次,原因在陣列的長度小,另外就是期待值設定的小,

再舉個長一點的例子,這裡有1-100的陣列,100個元素,期待值為100

簡單遍歷次數最大為元素的個數n次,本例中100次

使用二分查詢只需要log2n次,本例中17次!

package binarysearch;

/** * 二分查詢:求得期待值在有序陣列中的位置

* @author hellxz

*/public class mybinarysearch

//中間值小於期待值,我們需要將最小邊界下標移到中間下標的下一位

//此時,最大邊界不變,最小邊界變大,範圍縮小原來一半

if (middleval < expect)

//中間值大於期待值,說明最大邊界應小於中間下標

if (middleval > expect)

}//迴圈結束未返回下標說明陣列中不存在期待元素,返回null

return null;

}public static void main(string args) ;

int expectval = 25;

system.out.printf("當前期待的值為%d,其所在的下標為%d", expectval, binarysearch(arr, expectval));}}

本人不是科班出身,很多知識都在學習中,演算法與資料結構系列將不定時更新(學會哪個更哪個?)

查詢演算法 二分法

二分查詢演算法的基本思想 一.首先確定該區間的中間元素位置 mid low high 2 mid代表區間內中間元素的位置 low代表區間內最左邊元素的位置 high代表區間內最右邊元素的位置 二.將待查key元素值與中間元素mid的值 array mid 比較,如果相等,則查詢成功,否則確定新的查詢...

演算法 二分法查詢

1 2 二分法實驗 31 設a 0 n 1 是乙個已排好序的陣列.4請改寫二分搜尋演算法,使得當搜尋元素x不在陣列中時,5返回小於x的最大元素的位置i和大於x的最大元素位置j.6當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置.72 設有n個不同的整數排好序後存放於t 0 n 1 中,8若存在...

演算法 二分法查詢

給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。如果該題目暴力解決的話需要 o n 的時間複雜度,但是如果二分的話則可以降低到 o logn 的時間複雜度 遍曆法for迴圈,時間複雜度o n var searchinsert f...