基础版
/**
* Created with IntelliJ IDEA.
* Description:二分查找基础版
* User: dell
* Date: 2023-05-07
* Time: 22:35
*/
/*
* 分析实现思路:
* 1.设置两个指针,一个指向头一个指向尾
* 2.求出中间元素下标
* 使目标元素与中间元素比较,
* 如果比中间元素小证明目标元素在中间元素的左边,调整尾指针的位置到中间元素-1的位置
* 目标元素比中间元素大同理可得
* 3.当左边的指针>右边的指针时,证明该目标元素不存在,跳出循环直接返回-1
* */
public class BinarySearch {
/**
*
* @param a 待查找的升序数据
* @param targe 所需要查找的目标数据
* @return 返回查找的数据的下标,找不到返回-1
*/
public static int binarySearchBasic(int [] a,int targe){
//定义两个指针指向数组的头和尾
int i=0, j=a.length-1;
/*
*1. i和j指向的元素也有可能是我们查找的目标所以必须加上"="
* */
while(i<=j){//范围内有东西
/*
* 2.如果数组的长度足够大,当中间值变换时很可能超出java能够表示的最大正整数的范围
* 采用无符号右移可以解决
* */
// int m=(i+j)/2;
int m=(i+j)>>>1;
if(targe<a[m]){//目标在左边
j=m-1;
}else if(a[m]<targe){//目标在右边
i=m+1;
}else {
return m;
}
}
return -1;
}
}
升级版
public class BinarySearchNative {
/**
*
* @param a 待查找的升序数据
* @param targe 所需要查找的目标数据
* @return 返回查找的数据的下标,找不到返回-1
*/
public static int binarySearchBasic(int [] a,int targe){
int i=0, j=a.length;//1 j所指向的位置只作为边界
while(i<j){//2 这里如果加上等号 会陷入死循环
int m=(i+j)>>>1;
if(targe<a[m]){
j=m;//3
}else if(a[m]<targe){
i=m+1;
}else {
return m;
}
}
return -1;
}
}