二分查找算法

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章