打印
[经验分享]

二分法查找

[复制链接]
1746|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CPU单线程|  楼主 | 2011-10-23 12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
算法
  假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.   1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为mid>x,故应在前半段中查找。   2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>mid,故确定应在后半段中查找。   3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功。   如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。   例:在有序的有N个元素的数组中查找用户输进去的数据x。   算法如下:   1.确定查找范围front=0,end=N-1,计算中项mid(front+end)/2。   2.若a[mid]=x或front>=end,则结束查找;否则,向下继续。   3.若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2。   [一维数组,折半查找]
沙发
CPU单线程|  楼主 | 2011-10-23 12:11 | 只看该作者
 int search(int *a,int key,int low,int high)   {   int mid;   if(low > high)   return -1;   mid = (low + high)/2;   if(a[mid] == key) return mid;   else if(a[mid] > key)return search(a,key,low,mid -1);   else return search(a,key,mid + 1,high);   }   int main()   {   int a[] = {1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677};   int i = search(a,99,0,sizeof(a)/sizeof(a[0])-1);   cout << i << endl;   return 0;   }

使用特权

评论回复
板凳
CPU单线程|  楼主 | 2011-10-23 12:11 | 只看该作者
 int search(int *a,int key,int low,int high)   {   int mid;   if(low > high)   return -1;   mid = (low + high)/2;   if(a[mid] == key) return mid;   else if(a[mid] > key)return search(a,key,low,mid -1);   else return search(a,key,mid + 1,high);   }   int main()   {   int a[] = {1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677};   int i = search(a,99,0,sizeof(a)/sizeof(a[0])-1);   cout << i << endl;   return 0;   }

使用特权

评论回复
地板
全才太多| | 2011-10-24 00:11 | 只看该作者
很好,学习了

使用特权

评论回复
5
jacky20111| | 2012-2-7 15:03 | 只看该作者
我顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

123

帖子

1

粉丝