一:二分查找定义:

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 ——百度百科

二:二分查找基本操作:

1、找到该值在数组中的下标

inline int find1(int *a, int x) {
  int l=1,r=n;
  while(l<=r) {
    int mid=(l+r)>>1;
    if(a[mid]==x) return mid;
    else if(a[mid]<x) l=mid+1;
    else r=mid-1;
  }
  return -1;
}

2、查找第一个与\(x\)相等的元素在数组中下标

inline int find2(int *a, int x) {。 
  int l=1,r=n;
  while(l<=r) {
    int mid=(l+r)>>1;
    if(a[mid]>=x) r=mid-1;
    else l=mid+1;
    if(l<=n&&a[l]==x) return l;
  }
  return -1;
}

3、查找最后一个与\(x\)相等的元素在数组中下标

inline int find3(int *a, int x) { 
  int l=1,r=n;
  while(l<=r) {
    int mid=(l+r)>>1;
    if(a[mid]<=x) l=mid+1;
    else r=mid-1;
    if(r>=1&&a[r]==x) return r; 
  } 
  return -1;
}

4、查找最后一个小于\(x\)的元素下标

inline int find4(int *a,int x) { 
  int l=1,r=n;
  while(l<=r) {
    int mid=(l+r)>>1;
    if(a[mid]>=x) r=mid-1;
    else l=mid+1;
  }
  return r;
} 
//查找最后一个小于x的元素,也就是说返回小于x的最右边元素下标。

5、查找第一个大于等于\(x\)的元素下标

inline int find5(int *a,int x) { 
  int l=1,r=n;
  while(l<=r) {
    int mid=(l+r)>>1;
    if(a[mid]>=x) r=mid-1;
    else l=mid+1;
  } 
  return l;
}
//查找第一个等于或者大于x的元素,也就是说等于查找x值的元素有好多个
//返回这些元素最左边元素下标如果没有等于x值的元素,则返回大于x的最左边元素下标。

6、查找第一个大于\(x\)的元素下标

inline int find6(int *a,int x) {
  int l=1,r=n;
  while(l<=r) {
    int mid=(l+r)>>1;
    if(a[mid]>x) r=mid-1;
    else l=mid+1;
  }
  return l;
}

有写错的地方欢迎纠正,有什么不懂的地方可以留言问我 \(QwQ\)~