1.二分法搜索指定元素在有序序列中的位置或待插入的位置.
2.模擬STL裏的下界和上界查找函數lower_bound()和upper_bound().
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#define MAX(a,b) (a)>(b)?(a):(b)
using namespace std;
int bSearch(int *str, int x, int y, int v){ // 數組str [x,y) 找 v,返回索引
int mid;
while (x < y){
mid = x + (y - x) / 2;
if (str[mid] == v) return mid;
else if (str[mid]>v) y = mid;
else x = mid + 1;
}
return -1; //沒找到
}
int lower_bound(int *str, int x, int y, int v){//下界查找,返回v出現的第一個位置或者待插入的位置(插入後仍有序)
int mid;
while (x < y){
mid = x + (y - x) / 2;
if (str[mid] >= v) y=mid;
else x = mid+1;
}
return x; //沒找到
}
int upper_bound(int *str, int x, int y, int v){//上界查找,返回v出現的最後一個位置的下一個位置或者待插入的位置(插入後仍有序)
int mid;
while (x < y){
mid = x + (y - x) / 2;
if (str[mid] <= v) x = mid+1;
else y = mid;
}
return x; //沒找到
}
int main()
{
int str[] = { 1, 2, 4, 4, 4, 4, 12, 15, 24, 25 }; //有序序列
cout <<"二分查找:"<< bSearch(str, 0, 10, 4)<<endl;
cout << "二分找下界:"<<lower_bound(str, 0, 10, 4) << endl;
cout << "二分找上界:" << upper_bound(str, 0, 10, 4) << endl;
system("pause");
return 0;
}