今天来总结一下二分查找吧!
什么是二分查找?
我的理解就是:
在一个 排序好 的数组上(必须排序好的数组),通过一个中间值(middle),不断的去排除数组左边或者右边的,不断的折半进行查询
就好比1,2,3,4,5,6,7,8这个数组,我要查询3
(我们在这里定义几个变量:left→数组最左边值;right→数组最右边值,middle→数组中间值)
首先,我们给left,right,middle初始化
int left = 0;
int right = ary.length - 1;
int middle = left + (right - left) / 2;
这样就定义好了,当然,middle可以不在这里先定义,可以在下面操作中赋值;
然后通过key值和ary[left]或者ary[right]不断比较,来将数组的范围不断缩小,逻辑如下:
if(key > ary[mid]) // 判断待查询的值大于数组中间值,则说明需要在数组右半部分比较查询,因此将左下标置为mid+1
left = mid + 1;
else if(key < ary[mid]) // 判断待查询的值小于数组中间值,则说明需要在数组左半部分比较查询,因此将右下标置为mid-1
right = mid - 1;
else // 否则查询到key值,并返回
return key;
上面通过在循环不断比较和缩小范围,最终能得到key或者没有key对应的值,最终完成二分查找功能
下面贴出完整代码:
public class BrandrySearch {
/**
* 二分查找方法
* @param ary 必须是有序数组!
* @param key 待查询的值
* @return
*/
public int getKeyValue(int ary[], int key)
{
// 确保ary是有序的!
int left = 0; // 初始化数组左下标值
int right = ary.length - 1; // 初始化数组右下标值
int mid = 0; //定义二分查找中间下标
while(left <= right) // 这里一定要小于等于,自行验证
{
mid = left + (right - left) / 2; // 获取中间下标
if(key > ary[mid]) // 判断待查询的值大于数组中间值,则说明需要在数组右半部分比较查询,因此将左下标置为mid+1
left = mid + 1;
else if(key < ary[mid]) // 判断待查询的值小于数组中间值,则说明需要在数组左半部分比较查询,因此将右下标置为mid-1
right = mid - 1;
else // 否则查询到key值,并返回
return key;
}
return -1; // 没有查询到则返回一个判断值-1
}
}
以上为二分查询的完整方法,这里再次强调,数组必须是有序的(我之前写了一篇快速排序的方法,可以配合使用),希望和大家一起学习!
更多精彩敬请关注公众号
Java极客思维
微信扫一扫,关注公众号