I implemented the binary search algorithm. Input vector is sorted by <
than operator implemented by type T
. The less than operator is expensive so we want to use it as few times as possible.
I would like to know if there are any stupid mistakes, bad practices that I used and how I can improve the code.
template<class T>
long binary_search(const std::vector<T>& v, const T& key){
if(v.empty()) { return -1; }
long lo = 0;
long hi = v.size() - 1;
long mid = (long) floor((lo + hi ) / 2);
long pmid = -1; // prev mid
while(lo < hi && pmid != mid){
if(v[mid] < key){
lo = mid;
}
else{
hi = mid;
}
pmid = mid;
mid = (long) floor((lo + hi) / 2);
}
if(!(v[mid] < key) && !(key < v[mid])){
return mid;
}
if(mid - 1 >= 0){
if( !(v[mid - 1] < key) && !(key < v[mid - 1])){
return mid - 1;
}
}
if(mid + 1 <= v.size()){
if(!( v[mid + 1] < key) && !(key < v[mid + 1] )){
return mid + 1;
}
}
return -1;
}