查找就是在一系列數據中尋找指定的數據,有順序查找和折半查找(又叫二分法查找),順序查找是將這系列數據從頭至尾的遍歷一次,挨個的比較,較費時,但不要求數據有序的,而折半查找則要求數據是有序的,因為它先將要查找的數與序列中中間的那個數比較,假定序列是升序的,那么如果查找的數大於中間的數,則只需要在序列的右半部分找,再將右半部分序列中間的數與查找數比較,依次類推。。,如果找到就返回它的順序,沒找到就返回-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; }