概述
二分查找也称折半查找(Binary Search),它算是效率比较高的一种查找算法,但是使用它有个前提就是要求线性表必须是顺序存储结构,而且表中元素按关键字有序排列。简单的说就是你要是用数组存储数据,那么你用二分查找的前提就是你的数组是从大到小或者从小到大排列好的。
思路
二分查找的思路是先找到数组中的中间值,然后传入的数字和中间值比较,要是比中间值大就在数组后半部分查找,要是比中间值小就在数组前半部分查找。
源码
public class BinarySearch {
public boolean binarySearch(int[] arr,int temp){
//int temp是传入的数
int first=0;//初始数组下标的头
int last=arr.length-1;//初始数组下标的尾
int mid;//数组中间值下标
while (first<=last){
mid=first+((last-first)/2);//first+((last-first)/2)和(last+first)/2相等,但是在这不直接用(last+first)/2
if (arr[mid] == temp) {
return true;
}
else if (temp > arr[mid]){
first=mid+1;//头部的下标改变
}
else {
last=mid-1;//尾部的下标改变
}
}
return false;
}
}
测试代码:
public class Test {
public static void main(String[] args) {
BinarySearch bs = new BinarySearch();//new一个bs对象,在堆栈里开辟空间
int[] arry = new int[]{10,20,30,40,50,60};//定义一个数组
boolean s = bs.binarySearch(arry,25);//赋值传递再调用
System.out.println("是否查找到输入的数:"+s);//输出是否查找到输入的数
}
}
测试结果截图
代码运行效果图
注意事项
上述问题中我们说到first+((last-first)/2)和(last+first)/2相等,但是在这不直接用(last+first)/2,这是为什么呢?是因为(last+first)/2在一种极端的情况下会有溢出。
当last+first的结果大于表达式结果类型所能表达的最大值时,就会产生溢出。溢出后再/2得到的结果就不正确了。