骇人听闻的二分查找(某公司校园招聘笔试试题)(据说只有10%的程序员可以写出没有bug的二分查找)
2012-10-24 21:16
781 查看
二分查找思路很简单,但要把程序写对,却很难,有兴趣的话,可以在网上查一下相关资料,下面给出两种常见的错误:(至于具体错误原因,可以分析程序的执行)
错误程序1:
错误程序2:
正确程序如下:
错误程序1:
#include <iostream> using namespace std; int binarySearch(int a[], int n, int key) { int low = 0; int high = n - 1; int mid; while(low < high) //key可能刚好在low与high相等的地方 { mid = (low + high)/2; if(key == a[mid]) return mid; if(key < a[mid]) high = mid - 1; else low = mid + 1; } return -1; } int main() { int a[] = {0, 1, 2}; int n = 3; int key = 0; int result = binarySearch(a, n, key); if(-1 == result) cout << "no" << endl; else cout << "yes! location: " << result + 1 << endl; return 0; }
错误程序2:
#include <iostream> using namespace std; int binarySearch(int a[], int n, int key) { int low = 0; int high = n - 1; int mid; while(low < high) //可能是死循环 { mid = (low + high)/2; if(key == a[mid]) return mid; if(key < a[mid]) high = mid; else low = mid; } return -1; } int main() { int a[] = {0, 1, 2}; int n = 3; int key = 100; int result = binarySearch(a, n, key); if(-1 == result) cout << "no" << endl; else cout << "yes! location: " << result + 1 << endl; return 0; }
正确程序如下:
#include <iostream> using namespace std; int binarySearch(int a[], int n, int key) { int low = 0; int high = n - 1; int mid; while(low <= high) { mid = (low + high)/2; if(key == a[mid]) return mid; if(key < a[mid]) high = mid - 1; else low = mid + 1; } return -1; } int main() { int a[] = {0, 1, 2}; int n = 3; int key = 0; int result = binarySearch(a, n, key); if(-1 == result) cout << "no" << endl; else cout << "yes! location: " << result + 1 << endl; return 0; }
相关文章推荐
- 只有10%的程序员可以写出的没有Buy的二分查找
- 如何判断两个矩形是否有重叠部分?(某公司校园招聘笔试试题)
- A升杯子和B升的杯子如何倒出C升的水?(某公司校园招聘笔试试题,某另外公司校园招聘笔试试题)
- delete p 究竟把p怎么了?(某公司校园招聘笔试试题)
- 只有10%的程序员可以把二分查找写正确
- 求正整数数组构成的最小数(某公司2013年校园招聘笔试试题)
- 如何判断两个矩形是否有重叠部分?(某公司校园招聘笔试试题)
- 利用循环链表(单链)实现Josephus环(某公司校园招聘笔试试题)
- 判断表达式中括号是否匹配(栈的典型应用)(某公司校园招聘笔试试题)
- 求数组中n-1个元素的乘积的最大值(某公司2007年校园招聘笔试试题)
- 完全二叉树叶子节点数n0和总结点数N的关系 (某公司校园招聘笔试试题)
- [置顶] 各大IT公司校园招聘程序猿笔试、面试题集锦
- 各大IT公司2012校园招聘笔试面试整理
- 各大IT公司2012校园招聘笔试面试整理
- 各大IT公司校园招聘程序猿笔试、面试题集锦
- 微软2014校园招聘笔试试题
- 360公司2015年秋季校园招聘笔试考卷(技术类 D)部分试题程序验证和解析2
- 笔试面试(1)腾讯2014校园招聘软件开发类笔试试题
- 微软2014校园招聘笔试试题
- 各大IT公司校园招聘程序猿笔试、面试题集锦