下面的函数模板实现了二分查找。
功能:
从一个数组a[]的 i 到 j 的位置中寻找值为m的元素。如果找到,返回找到元素的索引值;找不到,返回-1。
要求:
类型T必须重载【==】和【<】。
template<typename T>
int Func(const T a[], int i, int j, const T &m)
{
if (i < 0 || i > j || a == nullptr)
{
return -1;
}
else if (i == j)
{
return (a[i] == m) ? i : -1;
}
auto k = (i + j) / 2;
if (a[k] == m)
{
return k;
}
else if (a[k] < m)
{
return Func(a, k + 1, j, m);
}
else
{
return Func(a, i, k - 1, m);
}
}
测试一下:
int a[] = { 1,3,6,8,12,24 };
char b[] = { 3,8,12,44,120 };
/*
X重载了==和<
*/
class X
{
private:
int m_;
public:
explicit X(int m) :m_{ m }
{}
bool operator==(const X &other) const
{
return m_ == other.m_;
}
bool operator<(const X &other) const
{
return m_ < other.m_;
}
};
X c[] = { X(1),X(3),X(5),X(7),X(90),X(111) };
int wmain()
{
int n = -100;
n = Func(a, 0, 6, 12);
std::cout << n << std::endl; // 4
n = Func(b, 2, 4, char(8));
std::cout << n << std::endl; // -1
n = Func(c, 0, 6, X(1));
std::cout << n << std::endl; // 0
return 0;
}