当前位置: 首页 > news >正文

今日分享 二分算法及多语言实现

一、二分算法是什么?

 

二分算法(Binary Search)是一种高效的查找算法,核心思想是“每次将查找范围缩小一半”,仅适用于有序数组(升序或降序)。相比线性查找(逐个遍历,时间复杂度O(n)),二分查找的时间复杂度仅为O(log₂n),数据量越大,效率优势越明显(如n=100万时,线性查找最多需100万次,二分查找最多仅需20次)。

 

二、二分算法的核心原理

 

以“升序数组中查找目标值”为例,步骤如下:

 

1. 初始化边界:定义左指针 left (指向数组起始位置,初始值0)、右指针 right (指向数组末尾位置,初始值 数组长度-1 );

2. 计算中间位置:每次取 mid = left + (right - left) / 2 (避免 left+right 溢出,优于 (left+right)/2 );

3. 比较与缩范围:

若 nums[mid] == 目标值 :找到目标,返回 mid (索引);

若 nums[mid] < 目标值 :目标在右半区,更新 left = mid + 1 ;

若 nums[mid] > 目标值 :目标在左半区,更新 right = mid - 1 ;

4. 循环终止:当 left > right 时,说明数组中无目标值,返回 -1 (表示未找到)。

 

三、经典例题:二分查找目标值

 

题目描述

 

给定一个升序排列的整数数组 nums 和一个目标值 target ,请查找 target 在 nums 中的索引;若不存在,返回 -1 。

示例:

输入: nums = [-1, 0, 3, 5, 9, 12] , target = 9 

输出: 4 (9在数组中索引为4)

输入: nums = [-1, 0, 3, 5, 9, 12] , target = 2 

输出: -1 (2不在数组中)

 

四、多语言实现代码

 

1. C语言实现

 

 

#include <stdio.h>

 

// 二分查找函数:返回目标值索引,未找到返回-1

int binarySearch(int nums[], int numsSize, int target) {

    int left = 0;

    int right = numsSize - 1; // 初始右边界为数组末尾

    

    while (left <= right) { // 循环条件:左<=右(覆盖所有可能位置)

        int mid = left + (right - left) / 2; // 避免溢出

        if (nums[mid] == target) {

            return mid; // 找到目标,返回索引

        } else if (nums[mid] < target) {

            left = mid + 1; // 目标在右半区,更新左边界

        } else {

            right = mid - 1; // 目标在左半区,更新右边界

        }

    }

    return -1; // 未找到目标

}

 

int main() {

    int nums[] = {-1, 0, 3, 5, 9, 12};

    int numsSize = sizeof(nums) / sizeof(nums[0]);

    int target1 = 9, target2 = 2;

    

    printf("目标值%d的索引:%d\n", target1, binarySearch(nums, numsSize, target1)); // 输出4

    printf("目标值%d的索引:%d\n", target2, binarySearch(nums, numsSize, target2)); // 输出-1

    return 0;

}

 

 

2. C++实现

 

 

#include <iostream>

#include <vector>

using namespace std;

 

// 二分查找函数:参数为vector数组,返回索引

int binarySearch(vector<int>& nums, int target) {

    int left = 0;

    int right = nums.size() - 1;

    

    while (left <= right) {

        int mid = left + (right - left) / 2;

        if (nums[mid] == target) {

            return mid;

        } else if (nums[mid] < target) {

            left = mid + 1;

        } else {

            right = mid - 1;

        }

    }

    return -1;

}

 

int main() {

    vector<int> nums = {-1, 0, 3, 5, 9, 12};

    int target1 = 9, target2 = 2;

    

    cout << "目标值" << target1 << "的索引:" << binarySearch(nums, target1) << endl; // 4

    cout << "目标值" << target2 << "的索引:" << binarySearch(nums, target2) << endl; // -1

    return 0;

}

 

 

3. Python实现

 

 

def binary_search(nums, target):

    left = 0

    right = len(nums) - 1 # 初始右边界为数组长度-1

    

    while left <= right:

        mid = left + (right - left) // 2 # Python整数除法用//

        if nums[mid] == target:

            return mid

        elif nums[mid] < target:

            left = mid + 1

        else:

            right = mid - 1

    return -1

 

# 测试

nums = [-1, 0, 3, 5, 9, 12]

target1 = 9

target2 = 2

print(f"目标值{target1}的索引:{binary_search(nums, target1)}") # 4

print(f"目标值{target2}的索引:{binary_search(nums, target2)}") # -1

 

 

4. Java实现

 

 

public class BinarySearch {

    // 静态方法:二分查找,参数为int数组和目标值

    public static int binarySearch(int[] nums, int target) {

        int left = 0;

        int right = nums.length - 1;

        

        while (left <= right) {

            int mid = left + (right - left) / 2;

            if (nums[mid] == target) {

                return mid;

            } else if (nums[mid] < target) {

                left = mid + 1;

            } else {

                right = mid - 1;

            }

        }

        return -1;

    }

 

    public static void main(String[] args) {

        int[] nums = {-1, 0, 3, 5, 9, 12};

        int target1 = 9, target2 = 2;

        

        System.out.println("目标值" + target1 + "的索引:" + binarySearch(nums, target1)); // 4

        System.out.println("目标值" + target2 + "的索引:" + binarySearch(nums, target2)); // -1

    }

}

 

 

5. PHP实现

 

 

<?php

// 二分查找函数:参数为数组和目标值

function binarySearch($nums, $target) {

    $left = 0;

    $right = count($nums) - 1; // count()获取数组长度

    

    while ($left <= $right) {

        $mid = $left + intval(($right - $left) / 2); // intval()确保整数

        if ($nums[$mid] == $target) {

            return $mid;

        } elseif ($nums[$mid] < $target) {

            $left = $mid + 1;

        } else {

            $right = $mid - 1;

        }

    }

    return -1;

}

 

// 测试

$nums = [-1, 0, 3, 5, 9, 12];

$target1 = 9;

$target2 = 2;

echo "目标值{$target1}的索引:" . binarySearch($nums, $target1) . "<br>"; // 4

echo "目标值{$target2}的索引:" . binarySearch($nums, $target2) . "<br>"; // -1

?>

 

 

6. JavaScript实现

 

 

// 二分查找函数:参数为数组和目标值

function binarySearch(nums, target) {

    let left = 0;

    let right = nums.length - 1; // length获取数组长度

    

    while (left <= right) {

        const mid = left + Math.floor((right - left) / 2); // Math.floor()向下取整

        if (nums[mid] === target) {

            return mid;

        } else if (nums[mid] < target) {

            left = mid + 1;

        } else {

            right = mid - 1;

        }

    }

    return -1;

}

 

// 测试

const nums = [-1, 0, 3, 5, 9, 12];

const target1 = 9, target2 = 2;

console.log(`目标值${target1}的索引:${binarySearch(nums, target1)}`); // 4

console.log(`目标值${target2}的索引:${binarySearch(nums, target2)}`); // -1

 

 

 


文章转载自:

http://08LVQusI.dwmtk.cn
http://6tpn3QCe.dwmtk.cn
http://kiqtK5EE.dwmtk.cn
http://Wg3YWVet.dwmtk.cn
http://a6UNTaBX.dwmtk.cn
http://JZXmwSGG.dwmtk.cn
http://sefKxfH5.dwmtk.cn
http://kEGXy1wJ.dwmtk.cn
http://WKelIVUV.dwmtk.cn
http://DFRG9HOH.dwmtk.cn
http://jRWvL6xS.dwmtk.cn
http://iBQsKAMB.dwmtk.cn
http://mosVq8X4.dwmtk.cn
http://tsc277dk.dwmtk.cn
http://bqjI2s6M.dwmtk.cn
http://iNeHy1pG.dwmtk.cn
http://dHSvznnB.dwmtk.cn
http://QPxAo8ik.dwmtk.cn
http://AYQa6tf5.dwmtk.cn
http://sOHkFuVf.dwmtk.cn
http://4WKLcldh.dwmtk.cn
http://7tYybvNP.dwmtk.cn
http://fJnyUV1G.dwmtk.cn
http://SNY0HJuJ.dwmtk.cn
http://gWpdWkLm.dwmtk.cn
http://3S7vvf6W.dwmtk.cn
http://APr7eZMr.dwmtk.cn
http://9PxbRxzA.dwmtk.cn
http://5i1pS7Ye.dwmtk.cn
http://QgZ7W4OM.dwmtk.cn
http://www.dtcms.com/a/376836.html

相关文章:

  • 【代码随想录算法训练营——Day8】字符串——344.反转字符串、541.反转字符串II、卡码网:54.替换数字
  • 软件项目验收中第三方检测服务总流程
  • Python采集1688拍立淘按图搜索,json数据返回
  • 【卷积神经网络详解与实例】4——感受野
  • 多模态学习双核引擎:对齐建立连接,融合释放价值
  • unity开发类似个人网站空间
  • 【不背八股】10.Redis知识点汇总
  • MySQL 整型数据类型:选对数字类型,让存储效率翻倍
  • OpenCV的图像金字塔
  • PMP考试学习计划与知识大纲
  • 自然语言处理开源框架全面分析
  • antd v5 support React is 16 ~ 18. see https://u.ant.design/v5-for-19 for...
  • 【硬件-笔试面试题-82】硬件/电子工程师,笔试面试题(知识点:讲讲单片机的内部晶振与外部晶振)
  • 【计算机网络 | 第12篇】网络应用原理
  • 【竞赛系列】机器学习实操项目05——客户信用评估模型进阶流程(含XGBoost、LightGBM、CatBoost 高级模型对比与参数优化)
  • 机器学习的本质:从跑模型到真正解决问题
  • LeakCanary最新稳定版
  • 个人博客系统-测试报告
  • 生活中的各种造型 参考多图
  • 独家 | 抖音生活服务调整:涂晴接管市场和达人运营,旭凯担任北部大区负责人
  • Spring Bean扫描
  • 第2讲 机器学习 - 导论
  • 【开题答辩全过程】以 基于Android的智慧旅游APP开发为例,包含答辩的问题和答案
  • Linux服务器的系统安全强化超详细教程
  • Dockerfile构建容器需要注意的事项。
  • YOLO 发展前景与创新点
  • 一个基于 .NET 开源、轻便的 Windows 优化工具,适用于 Win7 - Win11 最新版的优化!
  • RL【7-1】:Temporal-difference Learning
  • child_process 和 cluster的区别
  • 第十七篇|优尼塔斯东京校区的教育数据工程:学费函数、国籍网络与升学有向图