常见错误:
- 死循环:循环体外的初始化条件,与循环体内的迭代步骤, 都必须遵守一致的区间规则,也就是说,如果循环体初始化时,是以左闭右开区间为边界的,那么循环体内部的迭代也应该如此.如果两者不一致,会造成程序的错误.
- 溢出:middle = left + (right - left) / 2
- 终止条件:一般来说,如果左闭右闭,则left<=right; 如果一开一闭,则left<right; 关键看left能不能等于right,而且要考虑实际情况,有时不能这样简单终结,会出现死循环,如下面的binarySearch_better()。
running time analysis:T(n) = T(n/2) + Θ(1) ---> T(n) = Θ(lgn)
正确算法:
1 //normal binarySearch without optimization, closed interval, return value is mid(maybe mid=left=right) 2 int binarySearch(int a[], int n, int k){ 3 if(n<1) return -1; 4 5 int left,right,mid; 6 left = 0; //closed left 7 right = n-1; //closed right 8 9 while( left<=right ){ 10 mid = left+(right-left)/2; 11 12 if( a[mid]<k ) left = mid+1; 13 else if( a[mid]>k ) right = mid-1; 14 else return mid; 15 } 16 return -1; 17 }