一、核心思想
選定這批數據中居中間位置的一個數與所查數比較,看是否為所找的數,若不是,則利用數據的有效性,可以決定所找的數是在選定數的左側還是右側,從而很快可以將查找范圍縮小一半。以同樣的方法在選定區域中進行查找,每次都會將查找范圍縮小一半,從而較快的找到目的數。
有個限制條件就是:必須是有序數組!
二、源碼
package com.ctw;
/**
* @author TongWei.Chen 2018-09-25 16:20:15
* @Description:
* @Project sjjg-sf
*/
public class BinaryFind {
/**
* 二分查找
*
* @param arr:數組
* @param value:所需要找的值
* @return: 目的值所在數組的下標
*/
public static int binaryFind(long[] arr, long value) {
// 開始值
int start = 0;
// 末尾值
int end = arr.length - 1;
while (start <= end) {
// 中間值,二分法嘛,先取個中再說,每次進行二分的時候都需要重新計算中間值,所以放到循環里面。
int middle = (start + end) / 2;
// 1.如果碰巧了,目標值直接就是中間值
if (value == arr[middle]) {
return middle;
} else if(value < arr[middle]) {
// 2.若目標值比中間值小,那肯定是在中間值左側,則繼續從0到中間值這區間進行二分查找。
end = middle - 1;
} else {
// 3.若目標值比中間值大,那肯定是在中間值右側,則繼續從中間值到末尾值這區間進行二分查找。
start = middle + 1;
}
}
// 若所找的數不在數組里,則返回-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初學者學習交流群】:458430385
-
微信公眾號【Java碼農社區】
img 今日頭條號:編程界的小學生