码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找

时间:2017-08-18 23:55:24      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:结合   两种   pre   blog   round   style   logs   区间   技术分享   

递归版(在区间[x, y)中找v的位置)

技术分享
 1 //递归版二分查找 
 2 int bsearch(int * A, int x, int y, int v)
 3 {
 4 
 5     if(v<a[x] || v>a[y-1]) return -1;
 6     int m = x + (y-x)/2;                //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 
 7     if(A[m]==v) return m;
 8     else if(A[m]>v) return bsearch(A, x, m, v);
 9     else return bsearch(A, m+1, y, v);
10 }
View Code

 

迭代版:

技术分享
 1 //迭代版二分查找 
 2 int bsearch(int * A, int x, int y, int v)
 3 {
 4     int m;
 5     while(x<y)
 6     {
 7         m = x + (y-x)/2;            //同上 
 8         if(A[m]==v) return m;
 9         else if(A[m]>v)        y = m;
10         else                x = m+1;
11     }
12     return -1;
13 } 
View Code

 

上述两种有个缺陷,如果需要查找的元素在序列中有多个,输出的下标位置不固定

下面改进一下:当v存在时返回第一个位置的下标,当不存在时,返回其插入的位置下标

 

技术分享
 1 //二分法查找下界 
 2 int lower_bound(int *A, int x, int y, int v)
 3 {
 4     int m;
 5     while(x<y)
 6     {
 7         m = x + (y-x)/2;
 8         if(A[m]>=v) y = m;
 9         else x= m + 1;
10     } 
11     return x;
12 }
View Code

 

上述程序稍微改动一下可以得到upper_bound()函数

结合上述两个函数可以找出值v在序列中的区间 [L, R), 当v不存在时 L==R ,区间为空

 

二分查找

标签:结合   两种   pre   blog   round   style   logs   区间   技术分享   

原文地址:http://www.cnblogs.com/chcaxi/p/7392559.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!