基础篇-1.二分查找-《Java学习知识库》

admin 2025-11-02 01:29:41 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 要求
  • 算法描述
  • 算法实现
  • 解决整数溢出问题
  • 其它考法

    要求

    • 能够用自己语言描述二分查找算法
    • 能够手写二分查找代码
    • 能够解答一些变化后的考法

      算法描述

    1. 前提:有已排序数组 A(假设已经做好)
    2. 定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)
    3. 获取中间索引 M = Floor((L+R) /2)
    4. 中间索引的值 A[M] 与待搜索的值 T 进行比较① A[M] == T 表示找到,返回中间索引② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1 设置为左边界,重新查找
    5. 当 L > R 时,表示没有找到,应结束循环

      算法实现

      1. public static int binarySearch(int[] a, int t) {
      2. int l = 0, r = a.length - 1, m;
      3. while (l <= r) {
      4. m = (l + r) / 2;
      5. if (a[m] == t) {
      6. return m;
      7. } else if (a[m] > t) {
      8. r = m - 1;
      9. } else {
      10. l = m + 1;
      11. }
      12. }
      13. return -1;
      14. }

      解决整数溢出问题

    当 l 和 r 都较大时,l + r 有可能超过整数范围,造成运算错误,解决方法有两种:

    1. int m = l + (r - l) / 2;

    还有一种是:

    1. int m = (l + r) >>> 1;

    其它考法

    1. 有一个有序表为 1,5,8,11,19,22,31,35,40,45,48,49,50 当二分查找值为 48 的结点时,查找成功需要比较的次数 (4次)
    2. 使用二分法在序列 1,4,6,7,15,33,39,50,64,78,75,81,89,96 中查找元素 81 时,需要经过(4)次比较
    3. 在拥有128个元素的数组中二分查找一个数,需要比较的次数最多不超过多少次 ()

    对于前两个题目,记得一个简要判断口诀:奇数二分取中间,偶数二分取中间靠左。对于后一道题目,需要知道公式:

    1.二分查找 - 图1

    其中 n 为查找次数,N 为元素个数

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  0