前提:
数组必须是有序的(无序的数组可以用基本查找,从头找到尾巴=)
思想:
每次都去找中间的那个元素去比较大小,每次都可以减少一半的元素去参与比较
图解:
规则:
1.定义最小索引和最大索引
2.计算出中间索引
3.拿中间的索引和要查找元素的索引进行比较
相等:就返回当前的中间索引
不相等:
如果大了:在左边查找,max = min - 1
如果小了:在右边查找,min = min + 1
4.重新获取当前最小索引和最大索引
5.重复2. 3. 4步骤,直到找到匹配的索引(如果min > max的时候,说明没有该元素…)
代码实现:
/**
* 二分查找
* @param 数组集合
* @param 被查找的值
* @return 返回该值在数组中的索引(如果没有返回 -1)
*/
public static int getIndex(int array[], int value) {
//定义最大索引和最小索引
int max = array.length - 1;
int min = 0;
//计算中间索引
int mid = (max + min) / 2;
//拿中间的索引的值和好查找的值进行比较
while (array[mid] != value) {
if (array[mid] > value) {
max = mid - 1;
} else if (array[mid] < value) {
min = min + 1;
}
//数组中没有该元素
if (min > max) {
return -1;
}
mid = (max + min) / 2;
}
return mid;
}