二分查找
二分查找整型溢出bug
left和right均为整型,数值较大时相加会出现整型溢出的情况
mid=(left+right)/2;
用减法运算代替加法,改进为:
mid=left+(right-left)/2;
public class testBinSearch {
public static int binSearch(int[] array,int target){
int left=0;
int right=array.length-1; //[left,right]左闭右闭情况下right初值为length-1
int mid;
while(left<=right){ //[left,right]左闭右闭情况下,left=right时也属于合理搜索情况
mid=left+(right-left)/2; //减法运算代替加法
if(target==array[mid]){
return mid;
}
if(target<array[mid]){
right=mid-1; //[left,right]左闭右闭情况下,right更新为mid-1
}
if(target>array[mid]){
left=mid+1; //[left,right]左闭右闭情况下,left更新为mid+1
}
}
return -1;
}
public static void main(String[] args) {
int[] array={1,3,5,7,9,10,13,29};
System.out.println(binSearch(array,9));
}
}
运行结果:
4
Process finished with exit code 0
二分查找不同情况下指针边界值设置
标准情况,在[left,right]左闭右闭中搜索target
public class testBinSearch {
public static int binSearch(int[] array,int target){
int left=0;
int right=array.length-1; //[left,right]左闭右闭情况下right初值为length-1
int mid;
while(left<=right){ //[left,right]左闭右闭情况下,left=right时也属于合理搜索情况
mid=(left+right)/2;
if(target==array[mid]){
return mid;
}
if(target<array[mid]){
right=mid-1; //[left,right]左闭右闭情况下,right更新为mid-1
}
if(target>array[mid]){
left=mid+1; //[left,right]左闭右闭情况下,left更新为mid+1
}
}
return -1;
}
public static void main(String[] args) {
int[] array={1,3,5,7,9,10,13,29};
System.out.println(binSearch(array,9));
}
}
运行结果:
4
Process finished with exit code 0
特殊情况1,在[left,right)左闭右开中搜索target
public class testBinSearch {
public static int binSearch(int[] array,int target){
int left=0;
int right=array.length; //[left,right)左闭右开情况下right初值为length
int mid;
while(left<right){ //[left,right)左闭右开情况下,left=right时不属于合理搜索情况
mid=(left+right)/2;
if(target==array[mid]){
return mid;
}
if(target<array[mid]){
right=mid; //[left,right)左闭右开情况下,right更新为mid
}
if(target>array[mid]){
left=mid+1; //[left,right)左闭右开情况下,left更新为mid+1
}
}
return -1;
}
public static void main(String[] args) {
int[] array={1,3,5,7,9,10,13,29};
System.out.println(binSearch(array,9));
}
}
运行结果:
4
Process finished with exit code 0
特殊情况2,在(left,right)左开右开中搜索target
public class testBinSearch {
public static int binSearch(int[] array,int target){
int left=-1; //(left,right)左开右开情况下left初值为-1
int right=array.length; //(left,right)左开右开情况下right初值为length
int mid;
while(left<right){ //(left,right)左开右开情况下,left=right时不属于合理搜索情况
mid=(left+right)/2;
if(target==array[mid]){
return mid;
}
if(target<array[mid]){
right=mid; //(left,right)左开右开情况下,right更新为mid
}
if(target>array[mid]){
left=mid; //(left,right)左开右开情况下,left更新为mid
}
}
return -1;
}
public static void main(String[] args) {
int[] array={1,3,5,7,9,10,13,29};
System.out.println(binSearch(array,9));
}
}
运行结果:
4
Process finished with exit code 0