递归版(在区间[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 }
迭代版:
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 }
上述两种有个缺陷,如果需要查找的元素在序列中有多个,输出的下标位置不固定
下面改进一下:当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 }
上述程序稍微改动一下可以得到upper_bound()函数
结合上述两个函数可以找出值v在序列中的区间 [L, R), 当v不存在时 L==R ,区间为空
时间: 2024-12-10 09:46:15