This post is follow up of this, suggested by @loki-astari which can be found here.
Any further improvement is welcome.
Binary_Search.h
#ifndef BINARY_SEARCH_H
#define BINARY_SEARCH_H
template<typename RandomIt, typename T>
RandomIt binary_search(RandomIt begin, RandomIt end, const T& key);
#endif // BINARY_SEARCH_H
Binary_Search.cpp
#include <iostream>
#include <vector>
#include "Binary_Search.h"
/* search a key in an array using binary search */
template<typename RandomIt, typename T>
RandomIt binary_search(RandomIt begin, RandomIt end, const T& key)
{
RandomIt save_end = end;
while ( begin <= end )
{
// find the middle iterator
auto range = std::distance(begin, end);
RandomIt mid = begin;
std::advance(mid, range / 2);
if ( *mid == key ) // key found
{
return mid;
}
else if ( *mid > key ) // key may be on the left half
{
end = mid;
std::advance(end, -1);
}
else if ( *mid < key ) // key may be on the right half
{
begin = mid;
std::advance(begin, 1);
}
}
// key not found
return save_end;
}
int main()
{
std::vector<int> vec = {1, 7, 9, 10, 28, 28, 36, 49, 68, 99};
for (auto v : vec)
{
if ( binary_search(vec.begin(), vec.end(), v) != vec.end() )
{
std::cout << v << " is present" << std::endl;
}
else
{
std::cout << v << " is not present" << std::endl;
}
}
std::vector<int> vec1 = {-1, 2, 3, 12, 23, 50, 90, 98, 100};
for (auto v : vec1)
{
if ( binary_search(vec.begin(), vec.end(), v) != vec.end() )
{
std::cout << v << " is present" << std::endl;
}
else
{
std::cout << v << " is not present" << std::endl;
}
}
return 0;
}