二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。
起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法
其缺點是要求待查表為有序表,且插入刪除困難。
因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。
使用條件:查詢序列是順序結構,有序。
為何有了遞迴我們還要去看非遞迴呢?因為我們知道每當我們呼叫乙個函式jvm會在會在虛擬機器棧中建立乙個棧幀,那麼當我們遞迴次數不多當然看不出來,當遞迴的次數過多,那麼我們就會撐爆虛擬機器棧導致棧溢位。//二分查詢遞迴實現
public
static
intbinaryserach_recursion
(int arr,
int aimnum,
int low,
int high)
int middle=
(high+low)/2
;if(aimnum > arr[middle]
)else
if(aimnum < arr[middle]
)else
}
int middle=(high+low)/2;:這裡會有可能middle是int型別可能發生溢位的風險,這個我們在下面細講。//二分查詢非遞迴實現
public
static
intbinarysearch_loop
(int arr,
int aimnum,
int low,
int high)
int middle=0;
while
(low <= high)
else
if(arr[middle]
> aimnum)
else
return middle;
}return-1
;}
我們在前面看到我們每次算兩個數的平均數數時使用的是int middle=(low+high)/2; 這個在我們int範圍內當然沒事,但是當我們資料過大會導致溢位問題!
int right=
(high-low+1)
/2+low
public
static
intmean
(int a,
int b)
class
indexnode
}public
class
binaryserach_withnode
else
if(aimnum < arr[middle]
)else
else
break;}
}return pos;
}public
static
void
main
(string[
] args)
; indexnode pos=
binaryserach
(arr,0)
; system.out.
println
(pos.index )
; system.out.
println
(pos.flag);}
}
二分查詢 遞迴與非遞迴
最近做了一道題目,在弄清原理之後發現怎麼也過不去,找了幾個小時的bug,結果問題就出現在二分查詢的知識點上,暑假是有接觸過二分的題目,應該是沒有完全理解才會在昨天的那道題上碰釘子,藉此寫一下對二分的理解來鞏固鞏固以前的知識。一談起查詢,最先想到的無非是遍歷整組資料,複雜度為o n 但是對於一組有規律...
二分查詢演算法(遞迴 非遞迴)
二分查詢 binary search 先來個比較官方的解釋 二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 對數搜尋 英語 logarithmic search 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如...
二分查詢演算法(遞迴 非遞迴)
二分查詢是針對有序序列來說的,在有序序列中使用二分查詢能大大提高查詢效率。首先確定整個查詢區間的中間位置 mid 用待查關鍵字key值與中間位置的關鍵字值進行比較 若相等,則查詢成功 若大於,則在後 右 半個區域繼續進行折半查詢 若小於,則在前 左 半個區域繼續進行折半查詢 對確定的縮小區域再按折半...