前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二分查找---折半查找

二分查找---折半查找

作者头像
大忽悠爱学习
发布2021-03-15 18:33:32
6700
发布2021-03-15 18:33:32
举报
文章被收录于专栏:c++与qt学习

注意:查找的前提必须是有序数组或者容器

思想:

定义llow为顺序表最左端元素位置,high为顺序表右端元素位置。定义mid = (low+high) / 2,即顺序表的中间位置,然后用所查找的值与mid所在位置处的值比较,由于列表有序,若所查找的值比mid小,则只需在表的前半部分查找,否则只需在表的后半部分查找(若第一次比较就发现两值相等则直接返回当前值所在的位置),以此类推,直至查找到所寻找的值或确定所查找的值不在该列表内为止(即查找失败)。

有序数组中没有重复元素的情况下

代码语言:javascript
复制
#include<iostream>
using namespace std;
//二分查找算法---返回查找到的元素的下标
//数组 数组长度 查找的值
int test(int arr[],int len,int val)
{
	//判断传入的数组值是否合法
	if (len < 1)
	{
		return -1;
	}
	//最小值和最大值
	int low = 0;
	int high = len - 1;
	//
	while (low <= high)
	{
		int mid = (low + high) / 2;
		//判断查找元素值比中间元素值大还是小
		if (val > arr[mid])
		{
			low = mid + 1; //那么要去比mid大的左边区间进行折半查找,需要把最小值更新到mid+1
		}
		if (val < arr[mid])
		{
			high = mid - 1;//那么要去比mid小的右边区间进行折半查找,需要把最大值更新到mid-1
		}
		if (val == arr[mid])
		{
			return mid; //返回的就是查找到的元素下标
		}
	}

}
int main()
{
	int arr[8] = { -1,0,1,2,3,4,10,12};
	int num=test(arr,8,4);
	cout << "4元素在数组中下标位置为:" << num << endl;
	system("pause");
	return 0;
}

如果一个数组里有多个连续重复的值,我们想找到连续重复值中下标最小的应该怎么办呢?我们只需对else语句略作修改

代码语言:javascript
复制
#include<iostream>
using namespace std;
//二分查找算法---返回查找到的元素的下标
//数组 数组长度 查找的值
int test(int arr[],int len,int val)
{
	//判断传入的数组值是否合法
	if (len < 1)
	{
		return -1;
	}
	//最小值和最大值
	int low = 0;
	int high = len - 1;
	//
	while (low <= high)
	{
		int mid = (low + high) / 2;
		//判断查找元素值比中间元素值大还是小
		if (val > arr[mid])
		{
			low = mid + 1; //那么要去比mid大的左边区间进行折半查找,需要把最小值更新到mid+1
		}
		if (val < arr[mid])
		{
			high = mid - 1;//那么要去比mid小的右边区间进行折半查找,需要把最大值更新到mid-1
		}
		if (val == arr[mid])
		{
		//mid值要大于最小值的下标,判断mid前面是否有与val值相等的元素
			while (mid > low && arr[mid - 1] == val)//在不越界的前提下后一个值与前一个值相等
			{
				--mid;//下标减一
			}
			return mid; //返回的就是查找到的元素下标
		}
	}

}
int main()
{
	int arr[9] = { -1,1,1,2,3,4,4,10,12};
	int num=test(arr,8,4);
	cout << "4元素在数组中下标位置为:" << num << endl;
	system("pause");
	return 0;
}

递归方法实现

代码语言:javascript
复制
#include<iostream>
using namespace std;
//二分查找算法---返回查找到的元素的下标
//数组 数组长度 查找的值
int test(int arr[],int len,int val,int low,int high)
{
	//判断传入的数组值是否合法
	if (len < 1)
	{
		return -1;
	}
	//
	int mid = -1;
	//
	if (low <= high)
	{
		mid = (low + high) / 2;
		//判断查找元素值比中间元素值大还是小
		if (val > arr[mid])//要去mid右边,即比左边比mid大的区间
		{
			//这里如果在大区间里面找到了val的位置,就会返回下标,用mid来接收
			//没有找到返回-1
			mid=test(arr, len, val, mid + 1, high);
		}
		if (val < arr[mid])//要去mid左边,即比左边比mid小的区间
		{
			//这里如果在小区间里面找到了val的位置,就会返回下标,用mid来接收
			mid=test(arr, len, val, low, mid - 1);
		}
		if (val == arr[mid])
		{
			while (mid > low && arr[mid - 1] == val)//在不越界的前提下后一个值与前一个值相等
			{
				--mid;//下标减一
			}
			return mid; //返回的就是查找到的元素下标
		}
	}
	  //元素不在当前区间数组中
		return mid;
}
int main()
{
	int arr[9] = { -1,1,1,2,3,4,4,10,12};
	int num=test(arr,9,4,0,8);
	cout << "10元素在数组中下标位置为:" << num << endl;
	system("pause");
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注意:查找的前提必须是有序数组或者容器
  • 有序数组中没有重复元素的情况下
  • 如果一个数组里有多个连续重复的值,我们想找到连续重复值中下标最小的应该怎么办呢?我们只需对else语句略作修改
  • 递归方法实现
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档