簡單的二分查找

1.簡介

    這裏所講解的簡單的二分查找指的是在一個有序無重複元素的int類型的數組中查找需要的元素。

2.代碼

    public int binarySearch(int[] a ,int value){
		int low = 0, hi = a.length - 1;
    	while(low <= hi){
    		int mid = low + ((hi - low)>>1);
    		if(a[mid] == value){
    			return mid;
    		}else if(a[mid] < value){
    			low = mid + 1;
    		}else if(a[mid] > value){
    			hi = mid - 1;
    		}
    	}
    	return -1;
    }

代碼分析

舉例:數組

int[] a = {2,3,5,7,8,10};
  1. low <= hi
    在進行二分查找的時候,當低位指針和高位指針相遇時,如果還沒有找到要找的元素,這個時候就可以跳出循環了。

  2. low = mid + 1
    low不能mid(low=mid),假設low=mid,hi=mid - 1;當我們要找的元素 value >= max(數組中最大的元素),我們會找不到元素,也無法跳出循環 以舉例數組爲例,當我們要找 10 時,當 low = mid 這一步使 low = 4時;這時 low<=hi, int mid = low + ((hi - low)>>1) = 4, 這時mid的值沒法再增加,low也會一直爲4,雖然數組中有10,但是我們無法跳出循環,也無法找到10。

  3. hi = mid - 1
    hi不能爲mid(hi=mid),假設 low = mid + 1 , hi = mid;當我們要找的元素 value < min(數組中最小的元素),數組中沒有元素,但是無法跳出循環。以舉例數組爲例,當我們要找1時, 當 hi = mid 這一步使 hi = 0時;這時 low<=hi,int mid = low + ((hi - low)>>1) = 0, 這時 mid的值沒法再減小, hi也會一直爲0,雖然數組中沒有1,但是無法跳出循環。

總結

    在對一個有序無重複的int數組進行二分查找的時候,就是不斷的折半,直到高低位指針相遇跳出循環。還有要注意的就是當折半後low = mid + 1和hi = mid - 1 這些小細節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章