前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言必刷题】3.二分查找

【C语言必刷题】3.二分查找

作者头像
爱敲代码的小杨.
发布2024-05-07 19:15:56
870
发布2024-05-07 19:15:56
举报
文章被收录于专栏:JavaJava

?前言

二分查找又称为折半查找,是分治算法基础上设计出来的查找算法。 二分查找算法仅适用于有序序列,它只能用升序序列或者降序序列中查找目标元素。

?算法描述

二分查找的核心思想:不断地缩小搜索的区域,降低查找目标元素的难度。

  1. 前提:有已排序的数组arr。
  2. 定义左边界(Left),定义右边界(Right),确定搜索范围,循环执行二分查找.
  3. 获得中间下标 Middle = (Left + Right) / 2
  4. 中间下标的值,arr[Middle] 与待搜索的值 t 进行比较。
    • arr[Middle] == t 表示知道了,返回中间下标
    • arr[Middle] > t 中间值右侧的其他元素都大于t,不需要比较,中间下标左边去找,Middle - 1 设置右边界,重新查找。
    • arr[Middle] < t 中间值左侧的其他元素都小于t,不需要比较,中间下标右边去找,Middle + 1 设置左边界,重新查找。
  5. Left > Right ,表示没有找到,循环结束。

?算法实现

代码语言:javascript
复制
void binarysearch(int arr[], int Length, int t) // 数组、数组长度和要查找的数
{
	int find = -1;//标记

	int Left = 0; // 左边界
	int Right = Length - 1; // 右边界
	int Middle = 0; // 中间值

	while (Left <= Right) // Left > Right ,表示没有找到,循环结束。 
	{
		Middle = (Left + Right) / 2;
		if (arr[Middle] == t) // 找到了
		{
			find = 1;
			break;
		}
		else if (arr[Middle] > t) // 右侧都大于t
			Right = Middle - 1;
		else // 左侧都小于t
			Left = Middle + 1;
	}

	if (1 == find)
		printf("找到了,下标为:%d\n", Middle);
	else
		printf("没有找到\n");
}

?测试代码

代码语言:javascript
复制
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int Length = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
	int t = 0;
	scanf("%d", &t);

	binarysearch(arr, Length, t);

	return 0;
}	

?解决溢出问题

LeftRight 都较大时,Left + Right 有可能会超出整数的范围,造成计算错误,可以使用以下解决方法。

代码语言:javascript
复制
Middle = Left + (Right - Left) / 2;

?代码

代码语言:javascript
复制
#include<stdio.h>

void binarysearch(int arr[], int Length, int t);

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int Length = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
	int t = 0;
	scanf("%d", &t);

	binarysearch(arr, Length, t);

	return 0;
}	

void binarysearch(int arr[], int Length, int t) // 数组、数组长度和要查找的数
{
	int find = -1;//标记

	int Left = 0; // 左边界
	int Right = Length - 1; // 右边界
	int Middle = 0; // 中间值

	while (Left <= Right) // Left > Right ,表示没有找到,循环结束。 
	{
		Middle = Left + (Right - Left) / 2;
		if (arr[Middle] == t) // 找到了
		{
			find = 1;
			break;
		}
		else if (arr[Middle] > t) // 右侧都大于t
			Right = Middle - 1;
		else // 左侧都小于t
			Left = Middle + 1;
	}

	if (1 == find)
		printf("找到了,下标为:%d\n", Middle);
	else
		printf("没有找到\n");
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ?前言
  • ?算法描述
  • ?算法实现
    • ?测试代码
      • ?解决溢出问题
      • ?代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com