前提是數組已經排好序,(查18的下標)
數值 11 12 13 14 15 16 17 18 19 20
下標 0 1 2 3 4 5 6 7 8 9
第一步,首先取得數組 0~9 的中間元素中間元素的位置爲:(開始下標 0 + 結束下標 9)/2=下標 4通過下標 4 取得對應的值 15
18 大於 15,那麼我們在後半部分查找
第二步,取數組 4~9 的中間元素
4~9 的中間元素=(下標 4 + 1 +下標 9)/2=下標 7
下標 7 的值爲 18,查找完畢,將下標 7 返回即可
對於有重複元素的有序數組,二分查找需要注意以下要點:
if (val <= A[m]) h = m;
因爲 h 的賦值爲 m 而不是 m - 1,因此 while 循環的條件也就爲 l < h。(如果是 m - 1 循環條件
爲 l <= h)
- public int getPos(int[] A, int n, int val) {
- int l = 0, h = n - 1;
- while (l < h) {
-
int m = l + (h - l) / 2;
-
if (val <= A[m]) h = m;
-
else l = m + 1;
- }
- return A[h] == val ? h : -1;
- }