查找就是在一系列数据中寻找指定的数据,有顺序查找和折半查找(又叫二分法查找),顺序查找是将这系列数据从头至尾的遍历一次,挨个的比较,较费时,但不要求数据有序的,而折半查找则要求数据是有序的,因为它先将要查找的数与序列中中间的那个数比较,假定序列是升序的,那么如果查找的数大于中间的数,则只需要在序列的右半部分找,再将右半部分序列中间的数与查找数比较,依次类推。。,如果找到就返回它的顺序,没找到就返回-1.
下面用c++来实现(假定序列是从小到大的升序):
int bsearch(const int* arr, const int& len, const int& data) { int l = 0; int r = len-1; int mid = 0; while(l <= r) { mid = l + (r-l)/2; if(arr[mid] > data) r = mid-1; else if(arr[mid] < data) l = mid+1; else return mid; } return -1; }
我们来测试一下:
#include <iostream> using namespace std; int bsearch(const int* arr, const int& len, const int& data); int main(int argc, char* argv[]) { int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; cout<<"bsearch(arr, 10, 0) "<<bsearch(arr, 10, 0)<<endl; cout<<"bsearch(arr, 10, 0) "<<bsearch(arr, 10, 9)<<endl; cout<<"bsearch(arr, 10, 0) "<<bsearch(arr, 10, 10)<<endl; return 0; }
结果就是:
下面用模板实现一个泛型的版本:
template<typename T> int bsearch(const T* arr, const int& len, const T& data) { int l = 0; int r = len-1; int mid = 0; while(l <= r) { mid = l + (r-l)/2; if(*(arr+mid) > data) r = mid - 1; else if(data > *(arr+mid)) l = mid + 1; else return mid; } return -1; }