比数组的遍历更快速的 ----折半寻找法

简介: 比数组的遍历更快速的 ----折半寻找法

1、折半查找又称为二分查找,是一种效率较高的查找方法。

2、折半查找的前提条件:
查找表中的所有记录是按关键字有序(升序或降序) 。
查找过程中,先确定待查找数字在表中的范围,然后逐步缩小范围(每次将待查记录所在区间缩小一半),直到找到或找不到记录为止。

3、查找的算法可以简述为以下:
用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。
⑴ 取中间位置Mid:Mid=(Low+High)/2;
⑵ 比较中间位置记录的关键字与给定的K值:
① 相等: 查找成功;
② 大于:待查记录在区间的前半段,修改上界指针:High=Mid-1;
③ 小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1;
直到越界(Low>High),查找失败
4.代码演示

public class Homework {
   
    static int []a = new int[5];//定义一个长度为5的一维数组
    static Scanner sr = new Scanner(System.in);//调用输入类Scanner
    public static void main(String[] args) {
   
        iniArray();//给数组赋值
        sortArray();//给数组排序
        int a = sr.nextInt();
        if(searchX(a)) {
   //判断结果
            System.out.println("True");
        }
        else System.out.println("false");
    }
    //给数组赋值
    public static void iniArray(){
   
        for (int i = 0; i <a.length ; i++) {
   
            a[i] = sr.nextInt();
        }
    }
    //给数组元素排序的代码
    public static void sortArray(){
   
        for (int i = 0; i < a.length-1; i++) {
   //最后一个不用再比较,已经是最小的了
            for (int j = 0; j < a.length-1-i; j++) {
   //每次与a[i]比较,前面已经排好序的不用再排所以要减i,减1是因为不用跟自己比
                if(a[j]>a[j+1]){
   
                    int b = a[j];
                    a[j] = a[j+1];
                    a[j+1] = a[j];
                }
            }
        }
    }
    //以下为折半寻找法的具体代码
    public static boolean searchX(int x){
   
            int low = 0,height = a.length-1,middle = (low+height)/2;//首先定义low,height,middle对数组元素进行索引
            while (low<=height){
                                      //循环结束的条件是左边索引值大于右边索引值
                if (x<a[middle]){
                                     //如果寻找的x值小于数组中间值,则右端的height左移到原先的middle的左边
                    height = middle-1;
                    middle = (low+height/2);                       //然后再更新middle值
                }
                else if(x>middle){
                                    //反之亦同
                    low = middle+1;
                    middle = (low+height)/2;
                }
                else return true;
            }
            return false;
        }
}

如有需改进的地方欢迎看官指出

相关文章
|
前端开发 NoSQL 关系型数据库
0027Java程序设计-房屋出租管理系统
0027Java程序设计-房屋出租管理系统
164 0
0027Java程序设计-房屋出租管理系统
|
8月前
|
缓存 安全 API
API 接口开发与合理利用:构建高效、安全、可维护的数字桥梁
本文全面解析API接口的设计、优化与安全维护。API作为系统间交互的标准化契约,核心价值在于解耦系统、提升复用性和构建开放生态。设计时需遵循六大原则:明确输入输出、关注单一职责、实现自我表达、确保功能无重叠、保障幂等性及合理版本化。性能优化从批量处理、异步调用、并行执行等方面入手,同时结合缓存、池化技术和SQL优化提升效率。安全性涵盖加密传输、加签验签、Token认证、防重放攻击及限流熔断等十大要点。最后,通过文档自动生成、日志体系和版本管理确保接口可持续迭代。优秀的API应以契约优先、演进思维和防御心态为核心,成为系统的数字资产,支持内外部高效协作与生态建设。
|
12月前
|
前端开发 UED 开发者
React 悬浮按钮组件 FloatingActionButton
悬浮按钮(FAB)是常见的UI元素,用于提供突出的操作。本文介绍如何在React中使用Material-UI创建美观的FAB组件,涵盖基本概念、实现方法及常见问题解决。通过代码示例和优化技巧,帮助开发者提升用户体验,确保按钮位置、颜色、交互反馈等方面的表现,同时避免无障碍性和性能问题。
524 80
|
XML 缓存 前端开发
Electron-builder 是如何打包 Windows 应用的?
本文首发于微信公众号“前端徐徐”,作者徐徐深入解析了 electron-builder 在 Windows 平台上的打包流程。文章详细介绍了 `winPackager.ts`、`AppxTarget.ts`、`MsiTarget.ts` 和 `NsisTarget.ts` 等核心文件,涵盖了目标创建、图标处理、代码签名、资源编辑、应用签名、性能优化等内容,并分别讲解了 AppX/MSIX、MSI 和 NSIS 安装程序的生成过程。通过这些内容,读者可以更好地理解和使用 electron-builder 进行 Windows 应用的打包和发布。
824 0
|
缓存 NoSQL Redis
Redis 如何批量设置过期时间?PIPLINE的使用
不要说在foreach中通过set()函数批量设置过期时间 我们引入redis的PIPLINE,来解决批量设置过期时间的问题。
942 0
Redis 如何批量设置过期时间?PIPLINE的使用
|
存储 编译器 定位技术
结构体数组在C语言中的应用与优化策略
结构体数组在C语言中的应用与优化策略
|
Web App开发 人工智能 物联网
操作系统的演变:从单一到多元,再到云端
在数字时代的浪潮中,操作系统(OS)作为计算机系统的核心,经历了从简单到复杂,再到云化的演变。本文将探讨操作系统的发展历程,包括早期的批处理系统、多道程序设计、分时系统的出现,以及现代操作系统的多样化和云端化趋势。我们将看到,随着技术的不断进步,操作系统不仅在性能上得到了提升,其设计理念和应用场景也发生了根本性的变化。
|
监控 数据可视化 数据挖掘
软考高项八大绩效域及论文纲要
软考高项八大绩效域及论文纲要
433 2
|
开发框架 前端开发 JavaScript
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)