【已解决】如何使用JAVA 语言实现二分查找-二分搜索折半查找【算法】手把手学会二分查找【数据结构与算法】

news2024/9/24 2:29:35

文章目录

  • 前言
      • 任务描述
      • 编程要求
    • 输出样例:未查找到11元素!
  • 二、代码实现
  • 总结
    • 理解不了考试的时候直接背下来就好了。


前言

[TOC]二分搜索

任务描述

折半查找(二分搜索)
a[low..high]是当前的查找区间,首先确定该区间的中点位置mid=(low+high)/2;然后将待查的k值与a[mid].key比较:
(1)若k==a[mid],则查找成功并返回该元素的物理下标;
(2)若k<a[mid],则由表的有序性可知a[mid..high]均大于k,因此若表中存在关键字等于k的元素,则该元素必定位于左子表a[low..mid-1]中,故新的查找区间是左子表a[low..mid-1]
(3)若k>a[mid],则要查找的k必在位于右子表a[mid+1..high]中,即新的查找区间是右子表a[mid+1..high]。
  下一次查找是针对新的查找区间进行的。

本关任务:编写一个进行二分搜索的小程序。

编程要求

根据提示,在右侧编辑器补充代码,能够实现二分搜索。

测试说明
输入样例:

10
1 2 3 4 5 6 7 8 9 10
6

(其中第一行的10:表示数组中元素的个数
第二行的1…10是输入的数组中的元素
第三行的6 是表示查找元素6)

输出样例:
6是数组中的第6个元素

输入样例:

10
1 2 3 4 5 6 7 8 9 10
11

(其中第一行的10:表示数组中元素的个数
第二行的1…10是输入的数组中的元素
第三行的11 是表示查找元素11)

输出样例:未查找到11元素!

二、代码实现

import java.util.Scanner;

/**
 1. @author 海宁不掉头发
 */
public class BinSearch {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //数组中元素的个数
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
            //输入数组中的元素
        }
        //查找的元素
        int target = scanner.nextInt(); // 需要查找的元素是多少
        scanner.close();
        int index = binarySearch(arr, target); // 定义一个二分查找的方法,对数组和穿进去的要查找那个元素进行操作
        //进行二分查找
        if (index != -1) {
            System.out.println(target + "是数组中的第" + (index + 1) + "个元素");
            //输出查找结果
        } else {
            System.out.println("未查找到" + target + "元素!");
            //输出未查找的结果
        }

    }

    public static int binarySearch(int[] arr, int target) {
        int low = 0;  // 初始位是0
        int high = arr.length - 1; //  最高位是数组中的最后一位
        while (low <= high) { // 循环一个元素,是否最小位的小于最大位
            int mid = (low + high) / 2; // 找到数组中在中间位置的下标
            //计算中点的位置
            if (arr[mid] == target) {  // 如果要查找数字的位置就是数组中间的元素
                return mid;//直接返回这个数字
            } else if (arr[mid] > target) { // 否则如果是 要查找的这个元素小于数组最中间的元素,那么肯定是在左边这一半了
                high = mid - 1;  // 中间数组的下标-1再赋给最高位 如此反复循环
            } else {
                low = mid + 1; // 否则就是在右边那一半,反复循环直到找到输入最初的那个数字的位置为止。
            }
        }
        return -1; //这里返回-1 的意思输入报错,所有条件均不满足,逻辑错误。当查找区间为空(即low > high)时,说明目标值不存在于数组中,返回 -1。
    }
}

总结

二分查找是一种高效的查找算法,适用于已排序的数组。其基本思想是将查找区间不断缩小一半,通过比较目标值与区间中间元素的大小关系来确定下一步查找的区间,重复这个过程直到找到目标值或者确定目标值不存在。

  1. 深了对算法效率的认识:通过对比二分查找和顺序查找的时间复杂度,深刻体会到选择合适算法的重要性。在处理大规模数据时,高效的算法可以大大节省时间和资源。
  2. 培养了逻辑思维能力:实现二分查找需要仔细考虑边界条件、循环条件和中间值的计算等问题,这锻炼了逻辑思维的严密性和准确性。
  3. 理解了分治思想的应用:二分查找是分治思想的一种体现,将问题不断分解为更小的子问题,通过逐步缩小查找区间来解决问题。这种思想在其他算法和问题解决中也有广泛的应用。
  4. 认识到数据结构和算法的重要性:良好的数据结构和高效的算法是编写高质量程序的基础。学习和掌握各种算法可以提高编程能力和解决问题的效率。

总之,学习用 Java 代码实现二分查找是一次很有价值的学习经历,不仅掌握了一种实用的查找算法,还提高了对数据结构和算法的理解和应用能力。

二分查找的关键核心代码:

public class BinarySearch {
    public static int binarySearch(int[] arr, int target) {
        int low = 0;
        int high = arr.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (arr[mid] == target) {
                return mid;
            } else if (arr[mid] < target) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return -1;
    }
}

理解不了考试的时候直接背下来就好了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片切换示例【JavaScript】

在 JavaScript 中实现图片切换可以通过多种方法&#xff0c;下面是一个简单的示例&#xff0c;使用 HTML、CSS 和 JavaScript 来实现图片的切换效果。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta c…

VMware Workstation 17.5安装教程

目录 软件介绍 1、下载安装包 2、安装虚拟机 3、卸载虚拟机 软件介绍 VMware&#xff08;虚拟机&#xff09;是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;通过它可在一台电脑上同时运行更多的Microsoft Windows、Linux…

看Threejs好玩示例,学习创新与技术(React-three-fiber)

什么&#xff0c;竟有人把ThreeJS和React绑定在一起&#xff0c;混着用&#xff1f; 1、VUE劫持问题 暂先把今天的问题先放一边&#xff0c;先简单回顾下vue劫持的情况。vue会把data里面的数据自动转换为属性&#xff0c;方便界面与数据交互。这本身是没有任何问题&#xff0…

快手旗下——Kolors模型部署与使用指南

以下是按照要求重写后的 Kolors 模型部署与使用指南&#xff0c;文章风格偏技术性&#xff0c;但保持简洁和易懂的特点&#xff1a; Kolors 模型部署与使用指南 一、Kolors 简介 Kolors 是由快手 Kolors 团队开发的文本到图像生成模型&#xff0c;基于大规模的潜在扩散技术。…

找不到libcef.dll怎么办,libcef.dll丢失怎么重新安装

在计算机使用过程中&#xff0c;我们常常会遇到各种问题。其中&#xff0c;libcef.dll丢失是一个常见的错误提示。libcef.dll是Chromium Embedded Framework的动态链接库&#xff0c;它是许多应用程序和游戏所必需的组件。当libcef.dll丢失或损坏时&#xff0c;可能会导致程序无…

2025秋招内推|招联金融

【投递方式】 直接扫下方二维码&#xff0c;使用内推码: igcefb 【招聘岗位】 深圳&#xff0c;武汉&#xff1a; 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营 客户体验管理 风险管理 资产管理 【校招流程】 简历投递&#xff1a;9月…

死磕P7: JVM内存划分必知必会(一)

这是「死磕P7」系列第 001 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 JVM 内存区域划分是面试常考点&#xff0c;属于死记硬背型&#xff0c;比较让人头大的是不同版本的 JDK 具有不同的划分方式&…

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

联合复现!考虑最优弃能率的风光火储联合系统分层优化经济调度!

前言 目前&#xff0c;尽管不断地追逐可再生能源全额消纳方式&#xff0c;大幅减小弃风弃光电量&#xff0c;但是若考虑风电、光伏发电的随机属性&#xff0c;全额消纳可能造成电网峰谷差、调峰难度及调峰调频等辅助服务费用的剧增&#xff0c;引起电网潜在运行风险。因此&…

英特尔AI加速器Gaudi 3下周发布,挑战NVIDIA统治地位!

英特尔正稳步推进其2024年计划&#xff0c;备受瞩目的AI加速器Gaudi3预计将于下周震撼登场。这款被誉为英特尔AI英雄的产品&#xff0c;专注于处理大规模训练和推理任务&#xff0c;拥有无与伦比的扩展能力。面对市场对高效能半导体的旺盛需求&#xff0c;英特尔首席执行官帕特…

Snap 发布新一代 AR 眼镜,有什么特别之处?

Snap 发布新一代 AR 眼镜&#xff0c;有什么特别之处&#xff1f; Snap 简介 新一代的 AR 眼镜特点 Snap 简介 Snap 公司成立于 2010 年&#xff0c;2017 年美国东部时间 3 月 2 日上午 11 时许&#xff0c;在纽交所正式挂牌交易&#xff0c;股票代码为 “SNAP”。其旗下的核…

力扣 2529.正整数和负整数的最大计数

文章目录 题目介绍解法 题目介绍 解法 采用红蓝染色体法&#xff0c;具体介绍参考 红蓝染色体法 通过红蓝染色体法可以找到第一个大于大于target的位置&#xff0c;使所以本题可以找第一个大于0的位置&#xff0c;即负整数的个数&#xff1b;数组长度 - 第一个大于1的位置即正…

2000-2012年各地级市市长特征信息数据/市长特征信息大全数据

2000-2012年各地级市市长特征信息数据 1、时间&#xff1a;2000-2012年 2、来源&#xff1a;百度搜索手工整理 3、指标&#xff1a;省级政区代码、省级政区名称、地市级政区代码、地市级政区名称、年份、市长姓名、出生年份、出生月份、籍贯省份代码、籍贯省份名称、籍贯地市…

垃圾邮件检测_TF-IDF分析,聚类分析与朴素贝叶斯

数据入口&#xff1a;基于机器学习的垃圾信息识别分类 - Heywhale.com 本数据集专为邮件和短信的垃圾信息分类设计&#xff0c;适合建立垃圾邮件检测模型。 数据说明 字段名说明message_content邮件或短信的正文内容is_spam标签&#xff0c;指示该消息是否为垃圾信息&#x…

恒生科指八连涨,汽车股强势

9月20日电 周五&#xff0c;港股三大股指集体收涨。恒生指数涨1.36%报18258.57点&#xff0c;连续第六个交易日上涨&#xff1b;恒生科技指数涨1.43%报3703.84点&#xff0c;连续第八个交易日上涨&#xff0c;创逾两个月来新高&#xff1b;恒生中国企业指数涨1.21%报6381.5点&a…

Set 和 Map 的模拟实现

1、引言 在数据结构与算法的学习与实践中&#xff0c;关联容器&#xff08;associative containers&#xff09;是不可忽视的重要工具。作为高效管理数据的一类容器&#xff0c;C 标准库中的 set 和 map 在现代软件开发中扮演着关键角色。这两个容器通过平衡二叉搜索树&#x…

c++类中的特殊函数

My_string.cpp #include <iostream> #include "my_string.h" #include <string.h> using namespace std; My_string::My_string():size(15) { this->ptr new char[size] ; this->ptr[0]\0;//串为空串 this->len 0; }; My_string::My_str…

Leetcode3289. 数字小镇中的捣蛋鬼

Every day a Leetcode 题目来源&#xff1a;3289. 数字小镇中的捣蛋鬼 解法1&#xff1a;哈希 代码&#xff1a; /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…

基于SpringBoot+Vue+MySQL的电影院购票管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着电影产业的蓬勃发展&#xff0c;电影院已成为人们休闲娱乐的重要场所。然而&#xff0c;传统的电影院购票管理系统存在诸多不便&#xff0c;如购票流程繁琐、排队时间长、无法提前选座等问题&#xff0c;给观众的观影体验带…