二分查找法(折半查找法):前提:数组必须是有序的
有的哥们一定会说无序也木事,无序排一下序不就得了,但是你要记住:排完序原来的数据就不一定在原来的位置了,这时用二分法查出来的位置就不一定是原位置。总之,是否采用这种查找法要根据需求来定。
思路:
1.通过角标先获取中间角标上的元素。
2.让该元素和要找的数据比较。
3.如果要找的数大了,缩小范围,要找的范围应该是,中间角标+1---尾角标
如果要找的数小了,要找的范围应该是,头角标---中间角标-1
4.不断如此重复,就可以找到元素对应的角标。
class Demo
{
public static void main(String args[]){
int[] arr = {9,12,15,24,36,41,59,68};
int n = binarySearch(arr,41);
System.out.println(n);
}
//第一种方式:
public static int binarySearch(int [] arr,int key){
//1.定义三个变量,记录头角标,尾角标,中间角标
int max,min,mid;
min = 0;
max = arr.length-1;
mid = (max+min)>>1;
//先取中间的数判断一下
while(arr[mid]!=key){
if(key>arr[mid]){
min = mid + 1;
}else if(key < arr[mid]){
max = mid - 1 ;
}
//判断元素是否存在
if(max<min)
return -1
mid = (max+min)>>1;
}
return mid;
}
//第二种方式:
public static int binarySearch2(int[] arr,int key){
//1.定义三个变量,记录头角标,尾角标,中间角标
int max,min,mid;
min = 0;
max = arr.length-1;
while(min<=max){
mid = (max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}
}
两种方式只是写法不同,建议第二种,因为比较整洁嘛...
关注我的微信公众号(曲健磊的个人随笔),观看更多精彩内容: