- 二分法的前提是数组已经从小到大排序了,没有排序的数据是无法查找的
- 二分法查找效率高于"一个挨着一个"这种查找方式
- 二分法查找的终止条件: 一直折半,直到中间的数据就是要找到的数据为止
10(下标0) 11 12 13 14 15 16 17 18 19 20(下标10) arr数组
通过二分法查找,找出18这个元素的下标:
(0+10) / 2 --> 中间元素下标: 5
中间元素是: arr[5] --> 15
15 < 18(被查找的元素)
被查找的元素18在目前中间元素15的右边
开始元素的下标从0变成5 + 1
再重新计算一个中间元素的下标:
开始下标是5+1 结束下标是10
(6 + 10) / 2 --> 8
arr[8] -->18
找到的中间元素正好和被罩元素18相等,表示找到了,下标为8
代码实现
/**
* 二分法查找
* @param arr 要查询数据所在的数组
* @param dest 要查询的数据
* @return 查询到的数据返回索引 未查询到返回-1
*/
public static int binarySearch(int[] arr,int dest){
//开始下标
int begin = 0;
//结束下标
int end = arr.length -1;
//开始查找
//开始元素在结束元素的左边或者相等,就有机会循环
while(begin <= end){
//获取中间元素下标
int mid = (begin + end) / 2;
if(arr[mid] == dest){
//正好找到了,返回索引
return mid;
}else if(arr[mid] < dest){
//说明要查找的元素在中间元素的右边
begin = mid + 1;
}else{
//说明要查找的元素在中间元素的左边
end = mid - 1;
}
}
return -1;
}