#include <iostream> #include <algorithm> #include <ctime> using namespace std; struct Generator { public: Generator(int val):value(val){} int operator() () { return (rand() % value); } private: int value; }; /************************************************************************/ /* 函数功能: 二分查找的迭代版本 未找到返回-1 */ /************************************************************************/ int BinarySearch1(int arr[], int length, int target) { int low = 0; int high = length - 1; while (low <= high) { int middle = (low + high) / 2; if(arr[middle] == target) return middle; else if (arr[middle] < target) low = middle + 1; else high = middle - 1; } return -1; } /************************************************************************/ /* 函数功能: 二分查找的迭代版本 未找到返回-1 */ /************************************************************************/ int BinarySearch2(int arr[], int lower, int upper, int target) { if(lower >= upper) return -1; int middle = (lower + upper) / 2; if(arr[middle] == target) return middle; else if (arr[middle] < target) return BinarySearch2(arr, middle + 1, upper, target); else return BinarySearch2(arr, lower, middle, target); } /************************************************************************/ /* 函数功能:特殊版本的二分查找,在序列2 3 4 7 8 9中查找数5位于那两个数之 间,若找到返回4的位置,若未找到返回-1 该算法不够健壮,程序的正确性依赖于输入的数据,下面的程序假定输入无重复元素*/ /************************************************************************/ int SpecialBinarySearch(int arr[], int length, int target) { int low = 0; int high = length - 1; //找下界 while(low < high) { if(low == high - 1) break; int middle = (low + high) / 2; if(target <= arr[middle]) high = middle; else low = middle; } if(arr[low] < target && arr[low + 1] > target) return low; else return -1; } int main() { int arr[10]; srand((unsigned)time(NULL)); generate(arr, arr + 10, Generator(20)); copy(arr, arr + 10, ostream_iterator<int>(cout, " ")); cout<<endl; sort(arr, arr + 10); int res = BinarySearch1(arr, 10, 5); if(res == -1) cout<<"未找到!"<<endl; else cout<<"找到了,哈哈!"<<endl; res = BinarySearch2(arr, 0, 10, 5); if(res == -1) cout<<"未找到!"<<endl; else cout<<"找到了,哈哈!"<<endl; for (int i = 0; i < 10; i++) arr[i] = 2 * i; sort(arr, arr + 10); copy(arr, arr + 10, ostream_iterator<int>(cout, " ")); cout<<endl; int target = 15; res = SpecialBinarySearch(arr, 10, target); if(res == -1) printf("没找到!/n"); else printf("找到了%d, 位于%d和%d之间!/n", target, arr[res], arr[res + 1]); system("pause"); }