二分查找法(Binary Search)

news/2025/1/22 13:27:07/

二分查找法(Binary Search)是一种高效的查找算法,适用于在有序数组或列表中查找特定元素。它的基本思想是通过不断将搜索范围减半来快速定位目标值。
算法步骤
初始化:设定搜索范围的起始点 left 和结束点 right,初始时 left = 0,right = 数组长度 - 1。

计算中间点:计算中间位置 mid = left + (right - left) // 2。

比较中间值:

如果 arr[mid] == target,找到目标值,返回 mid。

如果 arr[mid] < target,说明目标值在右半部分,更新 left = mid + 1。

如果 arr[mid] > target,说明目标值在左半部分,更新 right = mid - 1。

重复步骤2-3,直到 left > right,此时未找到目标值,返回 -1。

using System;class BinarySearch
{// 二分查找函数public static int BinarySearch(int[] arr, int target){int left = 0;int right = arr.Length - 1;while (left <= right){int mid = left + (right - left) / 2; // 防止溢出if (arr[mid] == target){return mid; // 找到目标值,返回索引}else if (arr[mid] < target){left = mid + 1; // 目标值在右半部分}else{right = mid - 1; // 目标值在左半部分}}return -1; // 未找到目标值}// 主函数static void Main(string[] args){int[] arr = { 1, 3, 5, 7, 9, 11 }; // 有序数组int target = 7;int result = BinarySearch(arr, target);if (result != -1){Console.WriteLine($"目标值 {target} 的索引是: {result}");}else{Console.WriteLine($"目标值 {target} 未找到");}}
}

代码说明
BinarySearch 方法:

接受一个有序数组 arr 和目标值 target。

使用 left 和 right 指针来定义搜索范围。

通过计算中间点 mid 来缩小搜索范围。

如果找到目标值,返回其索引;否则返回 -1。

Main 方法:

定义一个有序数组 arr 和目标值 target。

调用 BinarySearch 方法进行查找,并输出结果。

示例输出
目标值 7 的索引是: 3
时间复杂度
O(log n),其中 n 是数组的长度。每次比较都将搜索范围减半。

适用条件
数组必须是有序的(升序或降序)。

适用于静态数据(没有频繁插入或删除操作)。

变种
如果需要实现更复杂的二分查找(例如查找第一个等于目标值的索引或最后一个等于目标值的索引),可以对代码进行适当修改。例如:

查找第一个等于目标值的索引

public static int FindFirst(int[] arr, int target)
{int left = 0;int right = arr.Length - 1;int result = -1;while (left <= right){int mid = left + (right - left) / 2;if (arr[mid] == target){result = mid; // 记录当前找到的索引right = mid - 1; // 继续在左半部分查找}else if (arr[mid] < target){left = mid + 1;}else{right = mid - 1;}}return result;
}

http://www.ppmy.cn/news/1565229.html

相关文章

DM8 SQL 错误 [22000]: 锁超时

问题描述 DM管理工具删除会卡死DBeaver删除会一直加载中使用truncate语句会显示SQL 错误 [22000]: 锁超时使用如下语句也没有用 select a.*,b.NAME,c.SESS_ID, sp_close_session( || c.SESS_ID || ); AS CLOSE_SESSION_COMMAND from v$lock a left join sysobjects b on b.IDa…

从MySQL迁移到PostgreSQL的完整指南

1.引言 在现代数据库管理中&#xff0c;选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高&#xff0c;许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面&#xff1a; 1.1 性能和扩展性 PostgreSQL以其高性能…

Linux容器(初学了解)

目录 一、容器 1.1、容器技术 1.2、容器和虚拟机之间的差异 1.3、Rootless 和 Rootful 容器 1.4、设计基于容器的架构 1.5、容器管理工具 1.6、容器镜像和注册表 1.7、配置容器注册表 1.8、使用容器文件构建容器镜像 二、部署容器 2.1、Podman 实用程序 2.2、安装容…

root用户Linux银河麒麟服务器安装vnc服务

安装必要桌面环境组件 yum install mate-session-manager -y mate-session #确定是否安装成功安装vnc服务器 yum install tigervnc-server -y切换到root为root得vnc设置密码 su root vncpasswd给root用户设置vnc服务器文件 vi /etc/systemd/system/vncserver:1.service [Un…

Gin 源码概览 - 路由

本文基于gin 1.1 源码解读 https://github.com/gin-gonic/gin/archive/refs/tags/v1.1.zip 1. 注册路由 我们先来看一段gin代码&#xff0c;来看看最终得到的一颗路由树长啥样 func TestGinDocExp(t *testing.T) {engine : gin.Default()engine.GET("/api/user", f…

9. 神经网络(一.神经元模型)

首先&#xff0c;先看一个简化的生物神经元结构&#xff1a; 生物神经元有多种类型&#xff0c;内部也有复杂的结构&#xff0c;但是可以把单个神经元简化为3部分组成&#xff1a; 树突&#xff1a;一个神经元往往有多个树突&#xff0c;用于接收传入的信息。轴突&#xff1a;…

SDL2基本使用

前言 在这里记录SDL的环境基本搭建和使用&#xff0c;方便回忆。使用该图形库也是为了方便在没有单片机和显示模块的使用&#xff0c;也能对简单验证些关于图形构建或界面管理的猜想和测试&#xff0c;所以下述不会探讨过于深入的东西。当然&#xff0c;也可以通过SDL官网查看介…

(k8s)k8s部署mysql与redis(无坑版)

0.准备工作 在开始之前&#xff0c;要确保我们的节点已经加入网络并且已经准备好&#xff0c;如果没有可以去看我前面发表的踩坑与解决的文章&#xff0c;希望能够帮到你。 1.k8s部署redis 1.1目标 由于我们的服务器资源较小&#xff0c;所以决定只部署一个redis副本&#x…