• 算法基础——二分检索


    二分检索来查找一个数据是很快速的一种方法是一种很优秀的算法。

    我们现在有一个有序的数组我们需要查找它里面的一个元素。这时候我们应该怎么办呢,我们可以从这个数组的中间位置去查找。如果要寻找的数字比数组中间的数字大那么我们在这个数组的后半部分去查找,如果要寻找的数字比数组中间的数组小那么我们应该在这个数组的前半部分去查找。通过这样的方法我们可以比较快速地查找到这个元素。

    先看Pseudocode语言所书写的伪代码

    procedure BINSRCH(A,n,x,j)

    //给定一个按非降次序排列的元素数组A(1:n),n≥1,判断x是否出现。若是,则置j,使得x=A(j),若非,j=0//

      integer low,high,mid,j,n;

      low<-1;high<-n

      while low≤high do

           mid<-(low+high)/2

    case

        :x

        :x>A(mid):low<-mid+1

        :else:j<-mid;return j

    end case

       repeat

    j<-0;return j

    end BINSRCH

    我们在这里可以看到主要是通过low和high还有mid来控制查询的,low和high是随着程序的运行而逐步发生改变的。程序是有出口的当我们发现low不是≤high的时候我们就可以退出了说明找不到。

    这是我个人所书写的代码

    #include
    #include
    int w[7] = {0, 5, 10, 12, 13, 15, 18};//数组元素
    int low;int high;int mid; int n; 
    void pd(int n,int low,int high){
        if(low<=high){
          mid=(low+high)/2;
          if(n>w[mid-1]){
              low=mid+1; pd(n,low,high);//low发生改变在重新调用该函数
          }
          if(n
              high=mid-1; pd(n,low,high);//high发生改变再重新调用该函数
          }    
          if(n==w[mid-1]){
              printf("查找成功\n");
              printf("是数组中第%d个数字",mid);
              exit(0); 
          }
        }
        else//查找失败了需要跳出去
        printf("查找失败\n");

    int main()
    {
        printf("输入你想要查找的数字\n"); 
        scanf("%d",&n);
        pd(n,1,7);
        return 0;

    这个算法是很简单的是很容易理解的,但是局限性是很明显的它必须要求是有序的数组这个限制就很大了

    时间复杂度:                        

    成功:最好 O(1)                                   

    平均      O(logn)                                 

    最坏      O(logn)                      

    不成功: O(logn)   

  • 相关阅读:
    System Verilog 视频缩放图像缩放 vivado 仿真
    常用的基本命令(必掌握)
    剑指offer面试题24 二叉树搜索树的后续遍历序列
    leetcode 24. 两两交换链表中的节点
    UE5——动画重定向
    理想中的接口自动化项目
    全栈开发学习记录:一个简单的node.js服务器以及用到的表、视图、存储过程和配套测试的前端.
    【JAVA】Spring 框架
    ssm+vue+elementUI 公廉租房维保系统-#毕业设计
    DGIOT云云对接——第三方平台对接dgiot基本接口介绍
  • 原文地址:https://blog.csdn.net/m0_53345417/article/details/127697561