c++二分查找的左闭右开和左闭右闭的详解

c++根据二分查找的数组中没有重复的元素分为两种情况讨论

#这个只是适用一般的情况
情况1:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int lower_bound(vector<int>& nums, int target)//左闭右开的区间
{
	int low = 0, high = nums.size();
	while (low<high)
	{
		int mid = low + ((high - low) >> 1);
		if (nums[mid] > target)
			high = mid;
		else if(nums[mid]<target)
			low = mid + 1;
		else 
		    return mid;
	}
	return low;
}
int lower_bound2(vector<int>& nums, int target)//左闭右闭的区间
{
	int low = 0, high = nums.size() - 1;
	while (low <= high)
	{
		int mid = low + ((high - low) >> 1);
		if (nums[mid] > target)
			high = mid - 1;
		else if(nums[mid]<target)
			low = mid + 1;
		else 
		    return mid;
	}
	return low;
}
void main()
{
	vector<int> nums = { 5,8,9,10 };   
	// 所需要查的元素只有一个的时候    以上左闭右开和左开右闭的while循环里面的条件都是可以的
	// 但是遇到重复元素的时候   while循环中的条件就不行了  可以自己在本地IDE中测试一下
	int x= lower_bound(nums, 8);
	int y= lower_bound(nums, 9);
	int x2 = lower_bound2(nums, 8);
	int y2 = lower_bound2(nums, 9);
	cout << x << "  " << y << endl;
	cout << x2 << "  " << y2 << endl;
	cout << "end";
	return;
}

#这个适用于有重复元素有序的二分查找并且返回的是查找到的第一个元素
情况2:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int lower_bound(vector<int>& nums, int target)//左闭右开的区间
{
	int low = 0, high = nums.size();
	while (low<high)
	{
		int mid = low + ((high - low) >> 1);
		if (nums[mid] >= target)
			high = mid;
		else 
			low = mid + 1;
	}
	return low;
}
int lower_bound2(vector<int>& nums, int target)//左闭右闭的区间
{
	int low = 0, high = nums.size() - 1;
	while (low <= high)
	{
		int mid = low + ((high - low) >> 1);
		if (nums[mid] >= target)
			high = mid - 1;
		else 
			low = mid + 1;
	}
	return low;
}
void main()
{
	vector<int> nums = { 5,8,8,8,9,10 };  
	// 当数组中有重复的元素就要写成情况二中的左闭右闭和左闭右开中的while循环形式
	int x= lower_bound(nums, 8);
	int y= lower_bound(nums, 9);
	int x2 = lower_bound2(nums, 8);
	int y2 = lower_bound2(nums, 9);
	cout << x << "  " << y << endl;
	cout << x2 << "  " << y2 << endl;
	cout << "end";
	return;
}

总结

情况1中左闭右开和左闭右闭的while循环有一定的使用条件 二分查找的target在有序数组中必须只出现了一次。
情况2中左闭右开和左闭右闭的while循环,应对重复和非重复的target都是适用 的,所以平时要养成习惯,采用情况2中的while循环条件,本人比较喜欢情况2中的左闭右开写法

猜你喜欢

转载自blog.csdn.net/sinat_30467885/article/details/89140685