A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© D_Time 中级黑马   /  2015-9-19 00:42  /  1078 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//折半查找,返回要查找的数的位置
int searchItem(int arr[], int len, int key){
//先定义变量
    int low=0, high=len-1, mid;
//循环
    while (low<=high) {
    //计算mid的值
        mid = (low+high) / 2;//括号不能省略
    //判断key a[mid]
        if (key>arr[mid]) {
    //key>a[mid]    low = mid+1
            low = mid + 1;
        }else if (key<arr[mid]){
    //key<a[mid]    high = mid-1
            high = mid - 1;
        }else{
    //key==a[mid]   return mid
            return mid;
        }
  }
    return -1;
}


对于low和high和mid很模糊多感觉,怎么才能更好到理解呢?

9 个回复

倒序浏览
百度百科:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
回复 使用道具 举报 1 0
好好理解下就行了
回复 使用道具 举报
刚才没写完,按回车就发了。。。。。。。。。。
假设是一个排好顺序的数列
0,1,2,3,4,5,6,7,8,9
int low=0, high=len-1, mid;  //high=9
mid = (low+high)/2   //mid=4
如果key>arr[mid]成立的话,就证明key再4的后边,所以要查找的序列就变成了 5.6.7.8.9
这个时候low=5,就从第5个开始了,到最后一个,
如果key<arr[mid]成立的话,就证明key在4的前边,这时查找的序列是0,1,2,3
这个时候high=3,从0--3了。
如果key=arr[mid]成立,那直接就找到了。
以此类推就是了。


回复 使用道具 举报 1 0
本帖最后由 苏子瞻201068 于 2015-9-19 10:00 编辑

#include<stdio.h>
int main() {  
        int t[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};  
        int a,b,c,mid;  a=0;b=14;  
       scanf("%d",&c);  
      while(a<=b)
     {   
          mid=(a+b)/2;  
          if(c==t[mid])  
          {    printf("%d",t[mid]);    break;   }               else if(c>t[mid])   
           {a=mid+1;   else b=mid-1;  }
           if(a>b)  
           printf("无此元素");  
           return 0;
      }
}

回复 使用道具 举报
我主题里面有,可以看看
回复 使用道具 举报
D_Time 中级黑马 2015-9-19 22:48:43
7#
安若曦 发表于 2015-9-19 12:09
我主题里面有,可以看看

嗯嗯,谢谢哈
回复 使用道具 举报
D_Time 中级黑马 2015-9-19 22:56:44
8#
wjy0916 发表于 2015-9-19 08:23
刚才没写完,按回车就发了。。。。。。。。。。
假设是一个排好顺序的数列
0,1,2,3,4,5,6,7,8,9

多谢{:2_31:}
回复 使用道具 举报
D_Time 中级黑马 2015-9-19 22:57:51
9#
bowenfei 发表于 2015-9-19 08:13
好好理解下就行了

求方法,求分享
回复 使用道具 举报
每次在查找的时候,查找的数在min~mid,或者在mid~max的区间里,我们根据与mid的比较结果先确定查找数所在的区间,然后再相应地把这个区间的两个数取平均数缩小比较范围。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马