欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二分查找写法

程序员文章站 2022-04-07 19:16:49
...

二分查找写的很头疼,准备固定一下自己的写法。

二分可以用在以下的几个情况:

1.寻找数组中存在的值的坐标;

2.寻找数组中>=value的最小坐标,也即寻找数组中小于value的数量

3.寻找数组中>value的最小坐标,也即寻找数组中小于等于value的数量

其他的情况碰到了再说 - -

1可与2合并,加以判断,不存在则返回-1,重点是2与3

#include <iostream>
using namespace std;
//2.寻找数组中>=value的最小坐标,也即寻找数组中小于value的数量
int bisearch(int v[11], int t) {
	int l = 0;
	int r = 11;
	while (l < r) {
		int m = l + (r - l) / 2;
		if (v[m] <t) {
			l = m+1;
		} else {
			r = m;
		}
		cout<<"l:"<<l<<" "<<"r:"<<r<<" "<<"m:"<<m<<endl;
	}
	return l;
}
//3.寻找数组中>value的最小坐标,也即寻找数组中小于等于value的数量
int bisearch2(int v[11], int t) {
	int l = 0;
	int r = 11;
	while (l < r) {
		int m = l + (r - l) / 2;
		if (v[m]<=t) {
			l = m+1;
		} else {
			r = m;
		}
		cout<<"l:"<<l<<" "<<"r:"<<r<<" "<<"m:"<<m<<endl;
	}
	return l;
}

int main()
{
    int a[11]={1,2,2,2,3,3,3,3,3,10,11};
    int bbb=bisearch2(a,2);
	cout<<bbb;
}

书写的原则是,我们搜寻的区间是[left,right)  返回的是我们的left,每次mid更新注意防止溢出,循环条件是left<right。