下面的函数模板实现了二分查找。
功能:
从一个数组a[]的 i 到 j 的位置中寻找值为m的元素。如果找到,返回找到元素的索引值;找不到,返回-1。
要求:
类型T必须重载【==】和【<】。
templateint 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;}