zoukankan      html  css  js  c++  java
  • 二分查找

     
    #include <stdio.h>
    #include <stdlib.h>
    int erFensearch(int a[],int n,int key)
    {
    int low=0;
    int high=n-1;
    while(low<=high)
    {
    int mid=(low+high)/2;
    if(a[mid]<key) low=mid+1;
    else if(a[mid]>key) high=mid-1;
    else return mid;
    }
    return -1;
    }
    
    int Nodigui(int a[],int low,int high,int key)
    {
    if(low<=high)
    {
    int mid=(low+high)/2;
    if(a[mid]<key) mid=Nodigui(a,low,mid+1,key);
    else if(a[mid]>key) mid=Nodigui(a,low,mid-1,key);
    else return mid;
    }
    }
    
    int main()
    {
    int a[10]={12,15,18,28,36,45,85,164,232,311};
    int c;
    c=Nodigui(a,0,9,36);
    printf("%d",c);
    return 0;
    }
     
    
     
     

    补充:

    上述代码中,用到了一句话计算中间值:

    int mid=(low+high)/2;

    其实这里面有个漏洞,就是容易产生溢出,如果low和high是很大的值并且很接近的话,他们俩个相加,则会发生超出数据类型的溢出。

    修改为以下代码可以避免:

    int mid=low + (high-low)/2;

    从计算公式上来看,两个结果是一样的,但是看第二个公式,因为hign肯定不会溢出,所以high-low也肯定不会溢出,并且即使low加上(high-low)/2后,也不会超过high的值

  • 相关阅读:
    单行道
    学习C++50条忠告
    ROI
    OpenCV(图像处理)—访问像素的三种方法
    毕业课题项目——基于单目摄像头的距离测量
    API
    MFC
    STL
    debug、release
    Android中退出程序的提示框
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/9949759.html
Copyright © 2011-2022 走看看