前言
二分查找(Binary Search)在计算机科学中非常重要,因为它是一种高效的搜索算法。它的时间复杂度为O(log n),其中n是要搜索的元素数量。这意味着随着元素数量的增加,二分查找的性能增长速度非常慢,因此即使在大型数据集中,它也能快速找到目标元素。这种效率使得二分查找广泛应用于各种算法和数据结构中,例如在排序算法、查找算法和图算法中。
一、二分查找数组中的某个数下标
二分查找数组中某个数的下标是通过不断将搜索范围缩小一半,使其能够在较短的时间内找到目标元素
解决思路
1.先对数组进行升序排序(上一篇文章中已对排序进行了简单结束,便不再赘述)。
2.定义左右边界。
3.计算中间值并进行判断,如果中间值大于所要查找的数,便说明要查找的数处于左右边界所夹数组的前半段,修改右边界并再次迭代,如果中间值小于所要查找的数,便说明所要查找的数处于左右边界所夹数组的后半段,修改左边界进行迭代,如果中间值恰好等于所要查找的数便进行返回。
4.如果多次迭代后左右边界相等或左边界大于右边界说明数组中无要查找的数。
详细代码
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int data[]=new int[105];
for(int i=0;i<n;i++){
data[i]=in.nextInt();
}
//........对数组进行升序排序
//........
int x=7;//要查找的数
int le=0;//左边界
int ri=data.length-1;//右边界
while(le<=ri){
int mid=(le+ri)/2;//找中间
if(data[mid]>x){
ri=mid-1;
}else if(data[mid]<x){
le=mid+1;
}else{
System.out.println(mid);
break;
}
}
System.out.println(-1);
二、二分查找数组中大于等于某个数的最小下标
二分查找数组中大于某个数的最小下标是通过在判断是否满足中间数大于某个数的情况下进行迭代二分
解决思路
1.先对数组进行升序排序。
2.定义左右边界。
3.计算中间值并进行判断,如果中间值大于或等于所要查找的数,便说明要查找的下标处于左右边界所夹数组的前半段或为中间下标,记录中间下标修改右边界并再次迭代,如果中间值小于所要查找的数,便说明所要查找的数下标处于左右边界所夹数组的后半段,修改左边界进行迭代。
4.如果多次迭代后左右边界相等或左边界大于右边界说明数组中的数均小于这个数。
详细代码
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int data[]=new int[105];
for(int i=0;i<n;i++){
data[i]=in.nextInt();
}
//........对数组进行升序排序
//........
int index=-1;
int x=-1;
int le=0;//左边界
int ri=data.length-1;//右边界
while(le<=ri){
int mid=(le+ri)/2;
if(data[mid]>=x){
ri=mid-1;//修改右边界
index=mid;//记录符合条件的数的下标
}else {
le=mid+1;//修改左边界
}
}
System.out.println(index);
三、二分查找数组中的峰值
二分查找数组中大于某个数的最小下标是通过在已是否满足中间数处于峰值的状态下进行二分。
解决思路
1.判断数组左右边界是否为峰值。(该情形下不可对数组进行排序,且需对数组左右边界进行判断)
2.定义左右边界。
3.计算中间值并进行判断,如果中间值data[mid]小于data[mid-1],则在中间值靠近左边界处数组呈下降趋势,峰值在左右边界所夹数组的前半段,需修改右边界进行迭代,如果中间值data[mid]小于data[mid+1]则在中间值靠近右边界处数组呈下降趋势,峰值在左右边界所夹数组的后半段,需修改左边界进行迭代,以上均不满足说明中间值data[mid]所处位置便是峰值,记录位置后退出循环。
4.如果多次迭代后左右边界相等或左边界大于右边界说明数组中无峰值。
详细代码
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int data[]=new int[105];
for(int i=0;i<n;i++){
data[i]=in.nextInt();
}
int index=-1;
if(data.length==1){
System.out.println("系统峰值下标为0");//数组越界部分记为无穷小
}
if(data[0]>data[1]){
System.out.println("系统峰值下标为0");//判断左边界是否为峰值
}
if(data[data.length-1]>data[data.length-2]){
System.out.println("系统峰值下标为"+(n-1));//判断右边界是否为峰值
}
int l=1,r= data.length-2;//定义左右边界
while (l<=r){
int mid=(l+r)/2;//计算中间值
if(data[mid-1]>data[mid]){
r=mid-1;//修改右边界
}else if(data[mid]<data[mid+1]){
l=mid-1;//修改左边界
}else{
index=mid;//记录峰值
break;
}
}
System.out.println(index);
总结
二分查找,是算法中的一种简单快捷的查找方法,其核心思想在于判断数组的中间值是否满足条件,要确定的数在数组的哪一段,并通过不断修改左右边界的方式不断逼近所需的数,最终得到结果。