主要思想
文章内源码:源码链接
1.使用二分查找需要在一个顺序的数组中进行,进行查找的数组是有序的
2.主要思想是在查询时不是简单的从头遍历,而是从中间开始,比较要查找的值和数组中间的数值的大小,由于数组是有序的(假设是升序),如
果要找的值比中间值小,那么下一次就直接从中间值的左边找,这样就缩小了查找的范围,下次再从左边的范围进行二分查找,继续比较缩小范围.
代码实现
一.递归
public class BinarySearch {
/**
* 二分查找
* 思路:
* 将一个有序的数组分割为两份,将要询找的值与数组中间的数据进行比较;
* 如果要找的数比中间的数小就去左边找(这个和数组的升降序有关系);
* 如果要找的数比中间的数大就去右边找;
* 如果等于中间数就返回下标;
* 如果没找到返回-1;
* 注意:
* 要判断退出递归的条件
* 如果当左边的下标要小于右边右边的下标就说明已经递归完了
* @param arr
* @param left
* @param right
* @param findVal
* @return
*/
public int binarySearch(int[] arr , int left , int right , int findVal){
// 获取中间的下标
int mid = (left + right) / 2 ;
// 如果做下标大于了右下表就应该退出递归开始返回
if(left > right){
return -1;
}
// 如果要找的数比中间的数小,就向右递归
if(arr[mid] < findVal){
return binarySearch(arr , mid + 1 , right , findVal);
// 如果要找的数比中间的数大,就向左递归
}else if (arr[mid] > findVal){
return binarySearch(arr , left , mid - 1 , findVal);
// 如果要找的数和中间相等,就返回下标
}else if(arr[mid] ==findVal){
return mid;
// 如果都没有就说明没找到 返回-1
}else{
return -1;
}
}
}
二.非递归
public class BinarySearch {
/**
* 二分查找的非递归的方法
* 思路:
* 当做左下标小于等于右下标的时候就一直循环,
* 在循环体中动态的改变mid的值
* 每次循化都比较arr[mid]的值和要寻找值的大小,根据不同的情况来改变左下标和右下标的值
* @param arr
* @param value
* @return
*/
public int binarySearch(int[] arr , int value){
// 初始化左下标
int left = 0;
// 初始化右下标
int right = arr.length - 1;
// 初始化中间的值
int mid = 0 ;
// 当左下标小于等于右下标的时候就说明可以一直找
while(left <= right){
// 先计算mid 的值
mid = (left + right) / 2;
// 判断不同的情况
// 如果要找的值比中间值小,在左边
if (value < arr[mid]){
// 右下标的值进更换
right = mid - 1;
}else if(value > arr[mid]){ // 如果要找的值比中间值大,在右边
// 左下标的值进行更换
left = mid + 1;
}else {
// 如果相等的话就直接返回当前下标
return mid;
}
}
// 退出循环说明没找到,就返回-1
return -1;
}
}