簡單說就是折半再折半,很內容理解。
目的:看一次,永遠記住。(媽媽再也不用擔心我不會寫查找了)
難點:low,high操作。
@Test
public void binarySearch() {
//數組一定要是順序的。
double arr[] = {0.0, 0.001, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0, 3.0}
double key = 0.3;
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
double midVal = arr[mid];
if (key > midVal)//大在high區,把low往上擡,砍掉low區
low = mid + 1;
else if (key < midVal)//小在low區,把high往下壓,砍掉high區
high = mid - 1;
else {
System.out.println(key + "的位置是" + mid);
return;//--------找到了退出
}
}
System.out.println(-(low + 1));//沒找到,返回負數
}
當key大於的midVal的時候說明key在high區
low區的數據就放棄了,怎麼放棄low區?直接把最low的位置指到mid的位置就行了,但還不夠,還要多移一位才行(low=mid+1)。
這樣取值的區間就變成high區的了mid+1的位置到high。然後再折半。這時可能跑過頭了,再往回跑(high=mid-1)就行了。
只要記住key在高區就把low往上擡,key在低區就把high往下壓就行了。(爲什麼要mid+1或者-1,不直接等於mid?因爲mid已經和key比較過了)
核心就是解決low,high的操作,理解了這個操作,快速查找就不是問題。
簡單粗暴
如圖:其實就是排除法,不停的幹掉區域,通過不停移動low和high的位置,收縮範圍,最後找到。
mid=(low+high)/2 或者牛逼刺啦帶火花寫成mid=(low+high) >>> 1