一、核心思想
選定這批數(shù)據(jù)中居中間位置的一個(gè)數(shù)與所查數(shù)比較,看是否為所找的數(shù),若不是,則利用數(shù)據(jù)的有效性,可以決定所找的數(shù)是在選定數(shù)的左側(cè)還是右側(cè),從而很快可以將查找范圍縮小一半。以同樣的方法在選定區(qū)域中進(jìn)行查找,每次都會(huì)將查找范圍縮小一半,從而較快的找到目的數(shù)。
有個(gè)限制條件就是:必須是有序數(shù)組!
二、源碼
package com.ctw;
/**
* @author TongWei.Chen 2018-09-25 16:20:15
* @Description:
* @Project sjjg-sf
*/
public class BinaryFind {
/**
* 二分查找
*
* @param arr:數(shù)組
* @param value:所需要找的值
* @return: 目的值所在數(shù)組的下標(biāo)
*/
public static int binaryFind(long[] arr, long value) {
// 開(kāi)始值
int start = 0;
// 末尾值
int end = arr.length - 1;
while (start <= end) {
// 中間值,二分法嘛,先取個(gè)中再說(shuō),每次進(jìn)行二分的時(shí)候都需要重新計(jì)算中間值,所以放到循環(huán)里面。
int middle = (start + end) / 2;
// 1.如果碰巧了,目標(biāo)值直接就是中間值
if (value == arr[middle]) {
return middle;
} else if(value < arr[middle]) {
// 2.若目標(biāo)值比中間值小,那肯定是在中間值左側(cè),則繼續(xù)從0到中間值這區(qū)間進(jìn)行二分查找。
end = middle - 1;
} else {
// 3.若目標(biāo)值比中間值大,那肯定是在中間值右側(cè),則繼續(xù)從中間值到末尾值這區(qū)間進(jìn)行二分查找。
start = middle + 1;
}
}
// 若所找的數(shù)不在數(shù)組里,則返回-1;
return -1;
}
public static void main(String[] args) {
MyArray myArray = new MyArray();
myArray.add(1L);
myArray.add(2L);
myArray.add(3L);
myArray.add(4L);
myArray.add(5L);
myArray.add(6L);
myArray.add(12L);
myArray.add(20L);
myArray.add(30L);
myArray.add(33L);
int index = binaryFind(myArray.getArr(), 331L);
System.out.println(index);
}
}
三、廣告
-
碼云地址
QQ群【Java初學(xué)者學(xué)習(xí)交流群】:458430385
-
微信公眾號(hào)【Java碼農(nóng)社區(qū)】
img 今日頭條號(hào):編程界的小學(xué)生
