二分查找
2012-04-21 14:13
316 查看
二分查找是对已经排序好的序列进行查找。因为这个程序非常经典地简单又容易出错,所以在当着面试官纸上写程序的场合这个程序的命中率非常高。
源码如下:
上面的程序只是简单地实现了最基本的二分查找。下面来个高端的:
找出一个有序(字典序)字符串数组arr中值等于字符串v的元素的序号,如果有多个元素满足这个条件,则返回其中序号最大的。
int binSearch(char **arr, int b, int e, char *v);
源码如下:
#include <iostream> using std::cout; using std::endl; //xk> 二分查找 //xk>-------------------------------------------------- // 返回value在数组A中的索引 int binarySearch(int A[], int N, int value) { int low = 0; int high = N - 1; int mid; while(low <= high){ // mid = (low + high) / 2; // 这种写法容易溢出 mid = low + ((high - low) >> 1); if(A[mid] > value) { high = mid - 1; }else if(A[mid] < value){ low = mid + 1; }else{ return mid; } } return -1; } int main() { int A[] = {0, 1, 2, 3, 4, 5, 6, 7}; int n = binarySearch(A, 8, 4); cout << n << endl; return 0; }
上面的程序只是简单地实现了最基本的二分查找。下面来个高端的:
找出一个有序(字典序)字符串数组arr中值等于字符串v的元素的序号,如果有多个元素满足这个条件,则返回其中序号最大的。
int binSearch(char **arr, int b, int e, char *v);
#include <iostream> using std::cout; using std::endl; int binSearch(char **arr, int min, int max, char *v) { int mid; //xk> 注意防止终止条件不可达 // 若min为偶数,终止条件为min == max // 若min为奇数,终止条件为min == max - 1 // while(min < max)或while(min <= max)都会出现死循环 while(min < max - 1){ //xk> 注意防止溢出 mid = min + (max - min) >> 1; //xk> 因为要返回最大的序号,优先移动min,并且=0时也要继续移动 if(strcmp(arr[mid], v) <= 0){ //error> min = mid + 1; // 因为判断条件是<=0, 在等于时也会移动min // 这里不能加1,否则可能跳过已找到的,返回-1 min = mid; } else{ // 这里也不需要减1 max = mid; } } if(!strcmp(arr[max], v)){ return max; }else if(!strcmp(arr[min], v)){ return min; }else{ return -1; } } void main() { // 设计测试用例 }
相关文章推荐
- 20、二分查找的实现与应用
- #1128 : 二分·二分查找
- [POJ](1064)Cable master ---二分查找(查找)
- [POJ](2456)Aggressive cows ---二分查找+贪心(查找+贪心)
- 判断二分查找树A是否是二分查找树B的子树
- 二分查找 变形
- 数据结构实验之查找四:二分查找
- 二分查找概述
- poj 1840 Eqs 【解五元方程+分治+枚举打表+二分查找所有key 】
- 【贪心+二分查找】Office Keys CodeForces - 830A
- MTK优美代码赏析1:二分查找
- 在数组中进行二分查找找出某数在数组中的下标
- 二分查找组件
- soj 4392 double类型的使用和二分查找
- 递增和二分组合的查找法
- 数据结构基础(2) --顺序查找 & 二分查找
- hdu 2141 Can you find it? 二分查找
- TOJ 1671 Steady Cow Assignment -- 多重二分图匹配 + 二分查找
- POJ 3273 Monthly Expense 二分查找的应用
- 【顺序查找表】 包含顺序查找和二分查找,顺手加入了快排