• 二分查找


    一:二分查找定义:

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

    二:二分查找基本操作:

    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)~

  • 相关阅读:
    Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.
    .Net PostBack mechanism
    一些有用的正则表达式......收集中
    CI中利用hook实现用户权限访问
    PHP实现无限分类
    Unsatisfied forward or external declaration 错误分析
    Runtime error 217 at 00402840的错误原因
    Delphi Access Violation错误的分析
    植物大战僵尸全解密存档篇[转]学习内存读写的方法
    Delphi中模拟鼠标操作
  • 原文地址:https://www.cnblogs.com/grcyh/p/10127312.html
Copyright © 2020-2023  润新知